1 variables scope namespaces tcl language-lawyer
我对TCL中的变量范围有疑问,我有以下代码:
namespace eval ::hello {
variable player
variable name
namespace export *
}
proc ::hello::setPlay {value} {
set ::hello::player
}
proc ::hello::getPlay {} {
return $::hello::player
}
proc ::hello::setName {value} {
set ::hello::name
}
proc ::hello::getName {} {
return $::hello::name
}
proc GET_NAME {} {
#here I have a variable called name as well
set name "RON"
return $name
}
Run Code Online (Sandbox Code Playgroud)
在GET_NAME中,如果我将变量名称设置为"RON",它是否会设置在名称空间中声明的变量名称?我可以在GET_NAME和命名空间中使用相同的变量名吗?如果我variable name在GET_NAME中添加此行,这是否意味着,它会设置在名称空间中声明的变量?
过程中的变量(和lambda表达式)默认为该过程的本地变量.如果明确宣布别的东西(例如,使用global,upvar或variable),那么实际的夫妇一个局部变量来别处另一个变量,以便作用于一个(例如,读取或写入)是完全相同一样作用于其他.如果你使用一个变量名::的话,那就是一个命名空间的变量(全局命名空间只是一个参考::),这可能是或者相对于当前命名空间或全局命名空间,这取决于名字是否解决开始与::与否.(把它想象成文件名中的斜杠.)
在内部执行代码时namespace eval,始终使用variable在使用它们之前声明变量.这避免了全局变量阴影的问题,这些问题非常可怕,但由于某些现有代码依赖于它们而需要保留.(从技术上讲,你不需要这样做,namespace eval ::因为全局变量不能影响自己,但它不会受到伤害.)
处理细节:
在GET_NAME中,如果我将变量名称设置为"RON",它是否会设置在名称空间中声明的变量名称?
不,不是你写的代码.
我可以在
GET_NAME命名空间中使用相同的变量名吗?
您可以在两个地方使用相同的变量名称.这可能令人困惑,但它总体上限制了惊喜.
如果我加入这行
variable name的GET_NAME,这是否意味着,它将设置在名字空间declaired变量?
是.确切地说.(它将两者精确地结合在一起.)