Tcl:如何从不同的命名空间调用 proc,同时从其命名空间向我的 proc 传递一个变量?

Tcl: How do I call a proc from a different namespace, while also passing my proc a variable from its namespace?

我定义了两个脚本:第一个脚本调用第二个脚本中的过程。第二个脚本定义了一个命名空间 fooSpace,在 fooSpace 中定义了一个变量 fooValue,还在 fooSpace 中定义了一个过程 myProc

在我的第一个脚本中,我想用参数 myValue 调用我的 proc。我想让我的程序测试 myValue 是否存在于 fooSpace 中作为 fooValue。如果是这样,该函数将使用 fooValue 来做一些事情。

如果我理解正确,upvar 引用调用者的命名空间,在我的例子中它与函数的命名空间不同。但我不认为我可以在我的 proc 中执行 variable $myvalue,对吗?如何让我的 proc 使用 fooSpace 中定义的变量?

下面是我的代码returns"Can't read $fooSpace"

这是我的第一个脚本(位于 alpha.tcl)的样子:

source bravo.tcl
namespace import fooSpace::myProc

# call the fuction
myProc apples

这是我的第二个脚本(位于 bravo.tcl)的样子:

namespace eval fooSpace {
    namespace export myProc
    set apples "Apples are 3 for a dollar"

    proc myProc {myValue} {
        upvar $fooSpace::$myValue fruit
        if {[info exists fruit] == 1} {
            puts "$fruit"
        } else {
            puts "we don't have any $fruit today"
        } 
    }
}

How do I get my proc to use a variable defined in fooSpace?

你对 upvar 的使用是假的,你错过了 level 参数,#0:

upvar "#0" [namespace current]::$myValue fruit

此外,$fooSpace 没有引用命名空间 fooSpace,而是引用该名称的 proc-local 变量(因此 can't read "fooSpace": no such variable 错误);因此:

[namespace current]::$myValue

变成

::fooSpace::$myValue

But I don't think I can do variable $myvalue within my proc, either

这取决于,如果你想使用 link 变量 fruit,不,variable 命令不会给你那个。但是你当然可以像这样引用命名空间变量:

 variable $myValue

小建议:myValue 最好是 myVarmyVarName,因为参数表示(命名空间)变量 names(不是值由这些变量存储)。

你可以使用 namespace upvar 做你想做的事,它是为查看另一个命名空间中的变量而设计的:

namespace upvar $fooSpace $myValue fruit

或者,您可以使用 upvar 来执行此操作,但是之后您需要停止替换 fooSpace 变量名以包含命名空间分隔符(否则您最终会谈论在该名称空间中具有空名称的变量,该名称空间可能不存在)。这种引用控制是通过 ${…} 完成的,如下所示:

upvar ${fooSpace}::$myValue fruit

(你也可以使用${fooSpace}::${myValue},解析后都是一样的。)

不过我建议您使用 namespace upvar:它的效率要高得多,因为它根本不需要重新解析变量名。