【问题标题】:TCL calling a namespace variable from a proc outside the namespaceTCL 从命名空间外的 proc 调用命名空间变量
【发布时间】:2013-03-29 22:06:37
【问题描述】:

我几乎是一个新手,我正在尝试在使用 argv 的命名空间中设置一些变量,然后从命名空间之外的 proc 调用它们,但我无法理解如何做这。我正在尝试使用这样的代码(但显然这是错误的做法):

namespace eval Ns {
    variable spec [lindex $argv 1]
}

proc p {} {
    set spec "::Ns::spec"

}

【问题讨论】:

    标签: namespaces tcl


    【解决方案1】:

    正确的方法是使用variable:

    proc p {} {
        variable ::Ns::spec
        # ...
    }
    

    也可以是upvar:

    proc p {} {
        upvar #0 ::Ns::spec spec
        # ...
    }
    

    或(几乎)像你那样做:

    proc p {} {
       set spec $::Ns::spec
       # ...
    }
    

    如果变量在 proc 中改变,最后一种可能性不会改变变量。

    【讨论】:

    • 感谢您的回答!我现在理解我在 proc 中犯的错误......但是你能解释一下variable 的实际作用吗?我以为它只是用来在命名空间中设置变量,但显然我弄错了......
    • 它可以做到这一点,但它也可以用于将变量导入 proc。见manual第3段
    • @KaleidoEscape variable 命令在命名命名空间中创建变量(如果需要)——如果没有指定其他命名空间,则默认为 current 命名空间——并设置如果给出第二个参数,则该变量。最后,如果它在具有局部变量的上下文中(例如,一个过程),它会使与变量名的最后部分同名的局部变量成为命名空间的链接别名多变的。 variable 的大量使用实际上是退化的情况,其中部分是使用默认值完成的。
    • 好的,我想我明白了。感谢你们两位的澄清!
    【解决方案2】:

    ...或者调用返回值:

    proc Ns::getspec { } {
        variable spec
    
        return spec;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多