见下面的代码:
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命令一样? 为什么它总是返回一个空字符串?如果我想通过过程访问命名空间变量,而不是直接访问它们,则会使代码稍长一些。不是一个主要问题,但有点烦人
答案 0 :(得分:1)
它的工作原理是因为它是如何实现和记录的,也就是说这是一个相对武断的决定。然而,这是近20年前发生的一项决定,我们认为没有特别的理由重新审视它。谁知道什么(好的,可能是非常不明智的)代码会被破坏?
也就是说,variable
的主要用途是一个参数。在这种情况下会有什么结果?它甚至在相关变量不存在时使用:根本没有可能的合理结果,与set
不同,不是一个错误(它分配了一些)必要时命名空间中的结构,如果在过程中绑定局部变量)。当我们有四个参数时,你要求的结果也没什么意义:为什么要设置的最后一件事是这样的特权? set
命令拒绝这一点,因此不需要处理哲学后果。
最好让variable
继续做它目前的工作。编写显式读取可能会更长,但是对于代码的意图来说,它也更加清晰,而且在较长期内这是一件非常好的事情。