Function 为什么Tcl变量命令总是返回空字符串?
见下面的代码:Function 为什么Tcl变量命令总是返回空字符串?,function,variables,namespaces,tcl,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命令那样返回变量
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命令那样返回变量值呢?
为什么它总是返回空字符串?如果我想通过过程访问名称空间变量,而不是直接访问它们,那么代码会稍微长一些。这不是什么大问题,但有点烦人。默认情况下,
proc
命令返回一个空字符串。调用过程时,该过程的返回值是return
命令中指定的值。如果过程没有执行显式的返回
,则其返回值是在过程主体中执行的最后一个命令的值
有趣的是variable
命令从不返回任何值。它只是创建/初始化/修改名称空间变量。
% namespace eval foo {
variable bar 5
proc getBar {} {
variable bar
}
}
如果在Tcl过程中执行变量
命令,它将创建链接到相应名称空间变量的局部变量,因此这些变量由信息变量
列出
% info vars foo::*
::foo::bar
% set foo::bar; # Getting the 'bar' value
5
% variable foo::bar 10; # Note that it does not return any value as such.
%
% set foo::bar
10
%
由于过程getBar
中没有隐式/显式返回值,因此返回的是默认的空字符串
参考:,默认情况下,
proc
命令返回空字符串。调用过程时,该过程的返回值是return
命令中指定的值。如果过程没有执行显式的返回
,则其返回值是在过程主体中执行的最后一个命令的值
有趣的是variable
命令从不返回任何值。它只是创建/初始化/修改名称空间变量。
% namespace eval foo {
variable bar 5
proc getBar {} {
variable bar
}
}
如果在Tcl过程中执行变量
命令,它将创建链接到相应名称空间变量的局部变量,因此这些变量由信息变量
列出
% info vars foo::*
::foo::bar
% set foo::bar; # Getting the 'bar' value
5
% variable foo::bar 10; # Note that it does not return any value as such.
%
% set foo::bar
10
%
由于过程getBar
中没有隐式/显式返回值,因此返回的是默认的空字符串
参考:,这是命令的定义方式。这是有意义的,因为如果给定奇数个参数,最后一个参数是将声明为命名空间变量但不需要存在的名称。如果它不存在,
variable
应该返回什么值
不过,编写单个命令getter过程(假设变量存在)并不麻烦:
或者您可以使用TclOO对象(注意,您需要一个setter来初始化它):
如果愿意,可以在一次调用中定义对象:
oo::objdefine foo {
variable bar
method setBar v {set bar $v}
method getBar {} {set bar}
}
文档:,这是命令的定义方式。这是有意义的,因为如果给定奇数个参数,最后一个参数是将声明为命名空间变量但不需要存在的名称。如果它不存在,
variable
应该返回什么值
不过,编写单个命令getter过程(假设变量存在)并不麻烦:
或者您可以使用TclOO对象(注意,您需要一个setter来初始化它):
如果愿意,可以在一次调用中定义对象:
oo::objdefine foo {
variable bar
method setBar v {set bar $v}
method getBar {} {set bar}
}
文档:,它是这样工作的,因为这就是它的实现和文档化方式,也就是说,这是一个相对武断的决定。然而,这是近20年前作出的一项决定,我们认为没有特别的理由重新审视它。谁知道会有什么(好的,可能是很不明智的)代码被破坏 也就是说,
变量
的主要用途是使用单个参数。在这种情况下会有什么结果?它甚至在相关变量不存在时使用:根本不可能有合理的结果,而且与set
不同的是,这样做并不是一个错误(如果需要,它会在名称空间中分配一些结构,如果在过程中,它会绑定一个局部变量)。当我们有四个论点时,你所要求的结果也没有什么意义:为什么最后一个被设置的东西会以这种方式被授予特权?set
命令拒绝此操作,因此不需要处理哲学上的后果
最好让
variable
继续执行当前的操作。写一个显式的read可能也需要更长的时间,但是对于代码的意图也要清楚得多,从更长的时间来看,这是一件非常好的事情。它是这样工作的,因为它是如何实现和记录的,也就是说,这是一个相对武断的决定。然而,这是近20年前作出的一项决定,我们认为没有特别的理由重新审视它。谁知道会有什么(好的,可能是很不明智的)代码被破坏
也就是说,变量
的主要用途是使用单个参数。在这种情况下会有什么结果?它甚至在相关变量不存在时使用:根本不可能有合理的结果,而且与set
不同的是,这样做并不是一个错误(如果需要,它会在名称空间中分配一些结构,如果在过程中,它会绑定一个局部变量)。当我们有四个论点时,你所要求的结果也没有什么意义:为什么最后一个被设置的东西会以这种方式被授予特权?set
命令拒绝此操作,因此不需要处理哲学上的后果
最好让variable
继续执行当前的操作。写一个显式的read可能也需要更长的时间,但是对于代码的意图来说,这也相当清楚,从更长远的角度来看,这是一件非常好的事情