0

configbodyから戻りたいのですが、変数が設定されないようにせずに明示的に戻すことはできません。

私が見ている行動を理解するのを手伝ってください。次のコードを検討してください ( Itcl 3.4を使用):

package require Itcl
catch {itcl::delete class Model}
itcl::class Model {
    public variable filename "orig"
}

itcl::configbody Model::filename {
    if 1 {
        return ""
    } else {
    }
}

Model my_model
my_model configure -filename "newbie"
puts "I expect the result to be 'newbie:' [my_model cget -filename]"

空の文字列を返すと、ファイル名が新しい値に設定されません。戻らずに proc が失敗するのを許可すると、ファイル名が変更されます。これは、上記のコードで 1 を 0 に変更することで確認できます。

次のステートメントに関連していると思われます。

スクリプトに return がない場合、その値はスクリプトで評価された最後のコマンドの値です。

誰かがこの振る舞いと、私がどのように戻るべきかを説明してくれたら、助けていただければ幸いです.

4

1 に答える 1

1

Tcl はreturn、(タイプの) 例外をスローして処理しTCL_RETURNます。通常、プロシージャまたはメソッド ハンドラの外側の部分はその例外をインターセプトし、それをプロシージャ/メソッドの通常の結果に変換しますが、物事をインターセプトしcatchて、カバーの下を少し見ることができます。

ただし、configbodyそのメカニズムは使用しません。あるコンテキストでスクリプトを実行するだけで (何がわからない!)、そのコンテキストはTCL_RETURN更新に失敗したことを示すものとして扱われます。

回避策:

itcl::configbody Model::filename {
    catch {
        if 1 {
            return ""
        } else {
        }
    } msg; set msg
    # Yes, that's the single argument form of [set], which READS the variable...
}

または、 で実際のメソッドを呼び出して、configbody必要な情報を渡します。

于 2015-06-24T12:43:22.053 に答える