tcl - itcl配置方法: How to use public variables with a config script?

标签 tcl itcl

在 Itcl 中使用公共(public)变量的配置脚本的正确方法是什么?

我的意思是,这就是我想做的:

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++ 编写 setter 方法的方式。首先,检查参数,如果有效,则将其分配给私有(private)变量。如果参数无效,则保持对象状态不变。

现在,我决定使用 Itcl 的 configure 机制重写代码,而不是为每个内部状态变量编写 getter 和 setter 方法。 (我喜欢以标准方式做事。)

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 配置脚本的正确方法是什么?我知道它们是为 Tk 小部件设计的,作为值更改时更新 GUI 的一种方式,但 Tk 小部件也需要验证它们的参数,不是吗?

最佳答案

我建议您升级到 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

关于tcl - itcl配置方法: How to use public variables with a config script?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29206754/

相关文章:

tcl - 检查 TCL 中的对象是否存在

format - 如何在 Tcl 格式命令中转义文字 %

windows - 当窗口改变位置时如何执行特定代码?

tcl - 跨平台移动到垃圾箱

user-interface - Tcl/Tk 中的交互式图表

regex - tcl 在迭代列表中的项目时获得正则表达式匹配

tcl - 在 native OO 中是否有替代 itcl::find 的方法?

namespaces - Tcl 命名空间重命名以避免冲突