tcl中的变量范围

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中添加此行,这是否意味着,它会设置在名称空间中声明的变量?

Don*_*ows 5

过程中的变量(和lambda表达式)默认为该过程的本地变量.如果明确宣布别的东西(例如,使用global,upvarvariable),那么实际的夫妇一个局部变量来别处另一个变量,以便作用于一个(例如,读取或写入)是完全相同一样作用于其他.如果你使用一个变量名::的话,那就是一个命名空间的变量(全局命名空间只是一个参考::),这可能是或者相对于当前命名空间或全局命名空间,这取决于名字是否解决开始::与否.(把它想象成文件名中的斜杠.)

在内部执行代码时namespace eval,始终使用variable在使用它们之前声明变量.这避免了全局变量阴影的问题,这些问题非常可怕,但由于某些现有代码依赖于它们而需要保留.(从技术上讲,你不需要这样做,namespace eval ::因为全局变量不能影响自己,但它不会受到伤害.)


处理细节:

在GET_NAME中,如果我将变量名称设置为"RON",它是否会设置在名称空间中声明的变量名称?

不,不是你写的代码.

我可以在GET_NAME命名空间中使用相同的变量名吗?

您可以在两个地方使用相同的变量名称.这可能令人困惑,但它总体上限制了惊喜.

如果我加入这行variable nameGET_NAME,这是否意味着,它将设置在名字空间declaired变量?

是.确切地说.(它将两者精确地结合在一起.)