1

我对 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
}

在 GET_NAME 中,如果我将变量名设置为“RON”,它会设置命名空间中声明的变量名吗?我可以在 GET_NAME 和命名空间中使用相同的变量名吗?如果我variable name在 GET_NAME 中添加这一行,这是否意味着它将设置在名称空间中声明的变量?

4

1 回答 1

5

过程(和 lambda 表达式)中的变量默认为该过程的本地变量。如果显式声明为其他东西(例如,withglobalupvarvariable,那么它实际上将一个局部变量耦合到其他地方的另一个变量,以便作用于一个变量(例如,读取或写入)就像作用于另一个变量一样。如果您在其中使用变量名称,::则它是对命名空间变量(全局命名空间只是::)的引用,该变量可能相对于当前命名空间或全局命名空间进行解析,具体取决于名称是否以开头::。(把它想象成文件名中的斜线。)

在里面执行代码时namespace eval,总是variable在使用变量之前先声明变量。这避免了全局变量阴影的问题,这些问题非常可怕,但由于某些现有代码依赖于它们而必须保留。(从技术上讲,您不需要这样做,namespace eval ::因为全局变量不会影响自己,但这不会造成伤害。)


处理细节:

在 GET_NAME 中,如果我将变量名设置为“RON”,它会设置命名空间中声明的变量名吗?

不,不是你写的代码。

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

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

如果我在 中添加这一行variable nameGET_NAME这是否意味着它将设置名称空间中声明的变量?

是的。正是这样。(它将两者精确地结合在一起。)

于 2012-06-21T09:47:27.760 回答