2

Itcl でパブリック変数の構成スクリプトを使用する適切な方法は何ですか?

つまり、これが私がやりたいことです:

class MyClass {

    private variable myVar

    public method setMyVar {arg} {
        if {![string is integer -strict $arg]} {
            return -code error "argument $arg is not an integer"
        }
        set myVar $arg
    }
}

少なくとも、これはセッター メソッドを C++ で書く方法です。まず、引数を確認し、有効であればプライベート変数に代入します。引数が有効でない場合は、オブジェクトの状態を変更しないでください。

ここで、私が持っている内部ステータス変数ごとにゲッター メソッドとセッター メソッドを記述する代わりに、Itcl のconfigureメカニズムを使用してコードを書き直すことにしました。(私は物事を標準的な方法で行うのが好きです。)

class MyClass {
    public variable myVar 10 {
        if {![string is integer -strict $myVar]} {
            return -code error "new value of -myVar is not an integer: $myVar"
        }
    }
}

myObj configure -myVar "some string"

このアプローチの問題は、引数が有効でない場合でも変数が割り当てられることです! そして、それを以前の値に戻す (簡単な) 方法はありません。

Itcl構成スクリプトを使用する正しい方法は何ですか? 値が変更されたときに GUI を更新する手段として Tk ウィジェット用に設計されたことは理解していますが、Tk ウィジェットは引数も検証する必要がありますね。

4

1 に答える 1

2

Tcl 8.6 と Itcl 4.0 にアップグレードすることをお勧めします。

% package req Itcl
4.0.2
% itcl::class MyClass {
    public variable myVar 10 {
        if {![string is integer -strict $myVar]} {
            # You had a minor bug here; wrong var name
            return -code error "argument $myVar is not an integer"
        }
    }
}
% MyClass myObj
myObj
% myObj cget -myVar
10
% myObj configure -myVar "some string"
argument some string is not an integer
% puts $errorInfo
argument some string is not an integer
    (error in configuration of public variable "::MyClass::myVar")
    invoked from within
"myObj configure -myVar "some string""
% myObj cget -myVar
10
于 2015-03-23T09:42:48.293 に答える