scope - Tcl:如何从不同的命名空间调用 proc,同时从其命名空间传递我的 proc 变量?
问题描述
我定义了两个脚本:第一个脚本在第二个脚本中调用 proc。第二个脚本定义了一个命名空间fooSpace
,在其中定义了一个变量,并fooValue
在其中定义了一个过程。fooSpace
myProc
fooSpace
在我的第一个脚本中,我想用myValue
. 我希望我的 proc 测试是否myValue
存在于fooSpace
as 中fooValue
。如果是这样,该函数将fooValue
用来做一些事情。
如果我理解正确,upvar
则引用调用者的命名空间,在我的情况下,它与函数的命名空间不同。但我不认为我可以variable $myvalue
在我的过程中做,对吧?如何让我的 proc 使用中定义的变量fooSpace
?
我下面的代码返回“无法读取 $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"
}
}
}
解决方案
你可以使用 来做你想做的事namespace upvar
,它是为查看另一个命名空间中的变量而设计的:
namespace upvar $fooSpace $myValue fruit
或者,您可以使用upvar
它来执行此操作,但随后您需要停止替换fooSpace
变量名,以免之后包含命名空间分隔符(或者您最终会在该命名空间中谈论具有空名称的变量,这可能不存在)。这种引用控制是这样完成的${…}
:
upvar ${fooSpace}::$myValue fruit
(你也可以使用${fooSpace}::${myValue}
,解析后都一样。)
不过我建议您使用namespace upvar
:它的效率要高得多,因为它根本不需要重新解析变量名。
推荐阅读
- angular - 带布尔值的角度复选框
- java - Micronaut,如何将更新发送到 websocket 端点?(爪哇)
- angular - .NET Core 3.1 和 Angular 6 SignalR 设置连接但不接收消息
- pandas - 如何比较熊猫中的一对单词?
- r - 有没有办法在迷你图中定义 X,以便工具提示描述两个轴?
- c# - Admobs 测试激励广告在使用 Unity 制作的 Android 版本中仅加载两次
- c# - 传递一个 Binding 和一个常量字符串作为参数
- docker - 扩展 docker 镜像
- python - 有没有办法在使用 itemgetter 或 lambda 在 python 中排序时从字符串转换为整数?
- python - 查找网址总数