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
最好是 myVar
或 myVarName
,因为参数表示(命名空间)变量 names(不是值由这些变量存储)。
你可以使用 namespace upvar
做你想做的事,它是为查看另一个命名空间中的变量而设计的:
namespace upvar $fooSpace $myValue fruit
或者,您可以使用 upvar
来执行此操作,但是之后您需要停止替换 fooSpace
变量名以包含命名空间分隔符(否则您最终会谈论在该名称空间中具有空名称的变量,该名称空间可能不存在)。这种引用控制是通过 ${…}
完成的,如下所示:
upvar ${fooSpace}::$myValue fruit
(你也可以使用${fooSpace}::${myValue}
,解析后都是一样的。)
不过我建议您使用 namespace upvar
:它的效率要高得多,因为它根本不需要重新解析变量名。
我定义了两个脚本:第一个脚本调用第二个脚本中的过程。第二个脚本定义了一个命名空间 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
最好是 myVar
或 myVarName
,因为参数表示(命名空间)变量 names(不是值由这些变量存储)。
你可以使用 namespace upvar
做你想做的事,它是为查看另一个命名空间中的变量而设计的:
namespace upvar $fooSpace $myValue fruit
或者,您可以使用 upvar
来执行此操作,但是之后您需要停止替换 fooSpace
变量名以包含命名空间分隔符(否则您最终会谈论在该名称空间中具有空名称的变量,该名称空间可能不存在)。这种引用控制是通过 ${…}
完成的,如下所示:
upvar ${fooSpace}::$myValue fruit
(你也可以使用${fooSpace}::${myValue}
,解析后都是一样的。)
不过我建议您使用 namespace upvar
:它的效率要高得多,因为它根本不需要重新解析变量名。