Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 为什么Tcl变量命令总是返回空字符串?_Function_Variables_Namespaces_Tcl - Fatal编程技术网

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可能也需要更长的时间,但是对于代码的意图来说,这也相当清楚,从更长远的角度来看,这是一件非常好的事情