gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:59:52 27 4
gpt4 key购买 nike

我定义了两个脚本:第一个脚本调用第二个脚本中的 proc。第二个脚本定义了一个命名空间 fooSpace , 定义了一个变量 fooValuefooSpace , 并定义了一个过程 myProcfooSpace以及。

在我的第一个脚本中,我想用 myValue 的参数调用我的 proc。 .我希望我的 proc 测试是否 myValue存在于 fooSpacefooValue .如果是这样,该函数将使用 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不过:它的效率要高得多,因为它根本不需要重新解析变量名。

关于scope - Tcl:如何从不同的命名空间调用 proc,同时从它的命名空间传递一个变量给我的 proc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54953036/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com