サーチ…


構文

  • set varName ?value?
  • 設定されていない? -nocomplain ? ? - ? ? varName varName varName
  • puts $ varName
  • puts [set varName ]
  • 変数varName
  • グローバルvarNamevarName varName

備考

  • ?...? ?varNameなど Tclコマンドのオプション引数を表します。
  • ドキュメント: globalupvar

変数への値の代入

コマンドsetは、Tclの値を割り当てるために使用されます。次のように2つの引数を指定して呼び出すと、

% set tempVar "This is a string."
This is a string.

最初の引数(tempVar)で参照されるメモリ空間に2番目の引数( "This is a string")を配置します。 setは、常に最初の引数に指定された変数の内容を返します。上記の例では、 setは "This is a string"を返します。引用符なしで。

  • valueが指定されている場合、変数varNameの内容はvalueに等しく設定されます
  • varNameが英数字のみで構成され、カッコがない場合は、スカラー変数です。
  • varNameの形式がvarName(index)の場合、これは連想配列のメンバーです。

変数の名前はラテンアルファベットに限定されず、Unicode文字(アルメニア語など)の任意の組み合わせで構成されます。

% set տուն house
house
% puts ${տուն}
house

スコーピング

set alpha 1

proc myproc {} {
    puts $alpha
}

myproc

2つのalphasが異なるスコープにあるため、このコードは機能しません。

コマンドset alpha 1は、グローバルスコープに変数を作成します(グローバル変数になります)。

コマンドputs $alphaは、コマンドmyproc実行時に作成されたスコープ内で実行されます。

2つのスコープは区別されます。つまり、 puts $alphaすると、 puts $alphaは名前alphaを検索しようとしますが、そのような変数は見つかりません。

しかし、それを修正することができます:

proc myproc {} {
    global alpha beta
    puts $alpha
}

この場合、2つのグローバル変数alphabetaは、プロシージャのスコープ内で別名変数(同じ名前)にリンクされています。エイリアス変数から読み込むとグローバル変数の値が取得され、グローバル変数の値がグローバル変数の値を変更します。

より一般的には、 upvarコマンドは、以前のスコープからの変数へのエイリアスを作成します。グローバルスコープ( #0 )で使用できます。

proc myproc {} {
    upvar #0 alpha alpha beta b
    puts $alpha
}

エイリアスには、( alpha )または別の名前( beta / b )にリンクされている変数と同じ名前を付けることができます。

グローバルスコープからmyprocを呼び出すと、この変種も動作します:

proc myproc {} {
    upvar 1 alpha alpha beta b
    puts $alpha
}

スコープ番号1は、「前のスコープ」または「呼び出し元のスコープ」を意味します。

あなたは本当に、何をやっている知っている限り#00 、および1で使用しても意味が唯一のスコープですupvar 。 ( upvar 0は、厳密にスコープ操作ではなくローカル変数のローカルエイリアスを作成します)。

その他の言語では、中括弧で範囲を定義し、各スコープで実行されるコードでは、周囲のスコープ内のすべての名前を参照できます。 Tclでは、プロシージャが呼び出されるときに1つのスコープが作成され、独自の名前だけが表示されます。プロシージャーが別のプロシージャーを呼び出すと、そのスコープは前のスコープの上に積み重ねられます。つまり、グローバルスコープとローカルスコープ(サブスコープ付き)のみを持つCスタイルの言語とは対照的に、各スコープは、開いているスコープに対してスコープを囲むスコープとして機能します。プロシージャが戻ると、スコープは破棄されます。

ドキュメント: globalupvar

変数の値を出力する

変数の値を表示するには、

set tempVar "This is a string."

puts文の引数の前には$記号が付いています。 $記号は、変数の値を使用するようにTclに指示します。

% set tempVar "This is a string."
This is a string.
% puts $tempVar
This is a string.

引数を1つ指定してsetを呼び出す

setは1つの引数で呼び出すこともできます。引数が1つだけ呼び出されると、その引数の内容が返されます。

% set x 235
235
% set x
235

変数の削除

unsetコマンドは、1つまたは複数の変数を削除するために使用されます。

unset ?-nocomplain? ?--? ?name name name name?
  • 名前は、 setコマンドで受け入れられる方法で指定された変数名です。
  • 名前が配列の要素を参照する場合、その要素は配列の残りの部分に影響を与えずに削除されます。
  • 名前がかっこ内にインデックスのない配列名で構成される場合、配列全体が削除されます。
  • -nocomplainが最初の引数として指定されている場合、すべてのエラーはコマンドの出力から除外されます。
  • オプション - はオプションの終わりを示し、任意のオプションと同じ名前の変数を削除する場合に使用する必要があります。
% set x 235
235
% set x
235
% unset x
% set x
can't read "x": no such variable

名前空間変数

variableコマンドは、指定された名前空間変数が作成されることを保証します。値が割り当てられるまで、変数の値は未定義です。

namespace eval mynamespace {
    variable alpha
    set alpha 0
}

この変数は、名前空間の名前から(実際にはどこからでも)名前空間の外部からアクセスできます。

set ::mynamespace::alpha

variableコマンドを再度使用すると、プロシージャ内でアクセスを単純化できます。

proc ::mynamespace::myproc {} {
    variable alpha
    set alpha
}

これにより、名前空間変数のローカルエイリアスが作成されます。

別の名前空間で定義されたプロシージャの場合、変数名にはvariableの呼び出しに名前空間を含める必要がありvariable

proc myproc {} {
    variable ::mynamespace::alpha
    set alpha
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow