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」に設定すると、名前空間でdeclairedされた変数名が設定されますか?GET_NAMEと名前空間に同じ変数名を付けることはできますか?そして、この行variable nameをGET_NAMEに追加すると、これは、名前空間でdeclairedされた変数を設定することを意味しますか?

4

1 に答える 1

5

プロシージャ(およびラムダ式)の変数は、デフォルトでそのプロシージャに対してローカルになります。明示的に他の何か(たとえば、、、または)であると宣言された場合globalupvar実際variableローカル変数を別の場所の別の変数に結合するため、一方に作用する(たとえば、読み取りまたは書き込み)ことは、もう一方に作用するのとまったく同じです。で変数名を使用する場合::、それは名前空間変数(グローバル名前空間はちょうど)への参照であり、名前がで始まる::かどうかに応じて、現在の名前空間またはグローバル名前空間のいずれかを基準にして解決される可能性があります。(ファイル名のスラッシュのようなものだと考えてください。)::

内部namespace evalでコードを実行するときは、変数を使用する前に必ずを使用variableして変数を宣言してください。これにより、グローバル変数のシャドウイングに関する問題が回避されます。これらの問題は、実際には恐ろしいものですが、既存のコードが依存しているために維持する必要があります。(技術的にはnamespace eval ::、グローバル変数はそれ自体をシャドウイングできないため、これを行う必要はありませんが、害はありません。)


詳細への対処:

GET_NAMEで、変数名を「RON」に設定すると、名前空間でdeclairedされた変数名が設定されますか?

いいえ、あなたが書いたコードではありません。

GET_NAMEと名前空間に同じ変数名を付けることはできますか?

2つの場所で同じ名前の変数を使用できます。これは混乱を招く可能性がありますが、全体的な驚きを制限します。

そして、この行をに追加するとvariable nameGET_NAMEこれは、名前空間でdeclairedされた変数を設定することを意味しますか?

はい。まさにその通りです。(2つを正確に結合します。)

于 2012-06-21T09:47:27.760 に答える