为什么Tcl变量命令总是返回一个空字符串?

时间:2015-08-26 14:46:20

标签: function variables namespaces tcl

见下面的代码:

namespace eval foo {
    variable bar 5
    proc getBar {} {
    variable bar
    }
    proc getRetBar {} {
    variable bar
    return $bar
    }
}
puts "\"[ foo::getBar ]\""
puts "\"[ foo::getRetBar ]\""
exit

输出:

""
"5"

为什么它不返回变量值,就像set命令一样? 为什么它总是返回一个空字符串?如果我想通过过程访问命名空间变量,而不是直接访问它们,则会使代码稍长一些。不是一个主要问题,但有点烦人

1 个答案:

答案 0 :(得分:1)

它的工作原理是因为它是如何实现和记录的,也就是说这是一个相对武断的决定。然而,这是近20年前发生的一项决定,我们认为没有特别的理由重新审视它。谁知道什么(好的,可能是非常不明智的)代码会被破坏?

也就是说,variable的主要用途是一个参数。在这种情况下会有什么结果?它甚至在相关变量不存在时使用:根本没有可能的合理结果,与set不同,是一个错误(它分配了一些)必要时命名空间中的结构,如果在过程中绑定局部变量)。当我们有四个参数时,你要求的结果也没什么意义:为什么要设置的最后一件事是这样的特权? set命令拒绝这一点,因此不需要处理哲学后果。

最好让variable继续做它目前的工作。编写显式读取可能会更长,但是对于代码的意图来说,它也更加清晰,而且在较长期内这是一件非常好的事情。