0

クラス変数の次の 2 つのバージョンを使用しました。

::itcl::class Subcase {
    variable _id
}

::itcl::class Subcase {
    variable _id    -1
}

明らかな唯一の明らかな違いは、前者には初期値がないことです。次のように定義されているアクセサを使用する場合:

public method ::hwascii::Subcase::Id {{newValue __keep__}} { if {$newValue != "__keep__"} { set _id $newValue }; return [set _id] }

最初に設定してからその値を取得するには、変数の宣言に使用した上記のバージョンに応じて、2 つの異なる動作が得られます。初期化されていない最初のケースでは、アクセサーは常に次をスローします。

can't read "_id": no such variable

しかし、2 番目の宣言では、期待どおりに動作し、初期値を返すか、変更されている場合はその新しい値を返します。

注 1: アクセサーを介して値を設定すると、常に機能します。

s info variable _id

いずれかを報告します

protected variable ::hwascii::Subcase::_id -1 42

また

protected variable ::hwascii::Subcase::_id <undefined> 42

初期化されたバージョンがあるかどうかによって異なります。

注 2: アクセサーは、concat と uplevel を使用して一種の「デフォルト」アクセサーを生成する proc で生成されるため、ワンライナーです。

注 3: tcl の私のバージョンは 8.5 です itcl の私のバージョンは 3.4 です どちらも変更できません

質問: 現在、有効な解決策がありますが、その違いを理解したいと考えています。良い説明は私の質問に答えます。良いドキュメントへのポインタもいいでしょうが、明らかに次へのリンクです:

http://www.tcl.tk/man/tcl8.6/Itcl4.0.0Cmd/class.htm#M22

またはさらに一般的にはしません。

4

1 に答える 1

0

Tcl は、定義された値に設定されていない変数から読み取らず、代わりに受け取ったエラーをスローします。(実装レベルでは、設定されていない変数は NULL に対応し、読み込もうとすると常にエラーが生成されます。もちろん、そのエラーをトラップして対処することは可能です。) 値を設定していない場合 — そのような宣言を介してvariable— 変数は厳密に存在します (つまり、ストレージ スペースとメタデータが割り当てられています) が、そこには何も含まれていないため、変数から読み取るとエラーが発生します。必要に応じて、メソッド内で使用info exists _idしてこのケースを検出できます。スクリプトは、長年のポリシーにより、存在するが値のない状態とまったく存在しない状態の違いを認識できるとは想定されていません。

Itcl は、Tcl の基本的な変数インフラストラクチャを使用します。メソッド内で実行するときに Tcl が変数を検索する方法 (変数解決メカニズム) を変更しますが、その後のすべては純粋に標準的な Tcl の動作です。値のない変数は読み取ることができず、まったく存在しないふりをします。(実際、Itcl が特別なトリックを行っていなければ、メモリ リソースをより効率的に使用するため、変数は完全に存在しません。)

于 2015-09-25T10:30:35.153 に答える