すぐに2つのファイルについては忘れてしまいます。
variable x hello ;# this is a global variable.
proc use {} {
puts $x
}
これは$x
のようなものが定義されていないと言うエラーになる必要があります:あなただけの1つのファイルを持っていると、コンテンツがあると仮定します。どうして?なぜなら、TclはCと異なり、あなたが要求していない関数には何もインポートしないからです。もう一度言ってみましょう:tcl procsには、あなたが見るように言わないグローバル変数または名前空間変数は表示されません。だから、
、伝統的な方法はglobal
コマンドを使用することでグローバル変数をインポートするには:
variable x hello
proc use {} {
global x ;# import $x into this proc
puts $x
}
これは動作するはずですが。 variable
コマンドは名前空間の変数を参照する名前空間で定義されprocsのを許可するために作成されましたので、言葉global
は意味がありませんもちろんの名前空間を持つ
:
namespace eval foo {
variable x hello
proc use {} {
variable x ;# import $x into this proc
puts $x
}
}
グローバルインポートする別の方法もありますし、 global
またはvariable
のいずれかを明示的に使用せずに名前空間変数を使用する場合は、完全な名前空間を指定します。グローバル名前空間はとても以下も動作します単に::
次のとおりです。
variable x hello
proc use {} {
puts $::x
}
そしてもちろん
:あなたは(どのファイルの使用手順は同じ変数と同じ名前空間になります」によって何を意味するか
namespace eval foo {
variable x hello
proc use {} {
puts $foo::x
}
}
コードは、コマンドと変数を作成する名前空間と100%直交しています)。 "あなたは意味ですか?使用プロシージャはa.tclで同じ変数を見ることができませんか? b.tclのものだけが見えますか? –
@ratzip私は、ファイルと名前空間が、彼らの仕組みにおいて互いに何の関係もないことを意味します。すべての 'source'はファイルの内容を文字列に読み込み、その文字列を' eval'します。 (まあ、 'info script'も設定していますが、細かい点です。)ファイル内に明示的に書かれていなければ、名前空間は使われません。つまり、a.tclとb.tcl _will_は、同じコンテキストからソースを取得した場合、同じ変数を参照します。 –
さらに、異なるコンテキストまたは異なる注文から実行したときのコードの動作が変更されないように、ネームスペースを明示的に指定することをお勧めします。あなたはそれほど簡単ではありませんが、それははるかに簡単です... –