首页 > 解决方案 > Tcl:如何从不同的命名空间调用 proc,同时从其命名空间传递我的 proc 变量?

问题描述

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

在我的第一个脚本中,我想用myValue. 我希望我的 proc 测试是否myValue存在于fooSpaceas 中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"
        } 
    }
}

标签: scopenamespacestcl

解决方案


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

namespace upvar $fooSpace $myValue fruit

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

upvar ${fooSpace}::$myValue fruit

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

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


推荐阅读