tcl OO yield在引用对象时不引用对象

时间:2017-05-24 15:04:50

标签: oop tcl superclass

当我运行我的(专有)代码时,我得到了这个:

info object isa class DlgClass is:1
DlgClass does not refer to an object
    while executing
"::oo::Obj6::my Set DlgClass"
    ("uplevel" body line 1)
    invoked from within
"uplevel 1 [list [namespace which my] Set $args]"
    (class "::oo::Slot" method "-set" line 2)
    invoked from within
"::oo::Obj6::my --default-operation DlgClass"
    ("uplevel" body line 1)
    invoked from within
"uplevel 1 [list [namespace which my] $def {*}$args]"
    (class "::oo::Slot" method "unknown" line 6)
    invoked from within
"superclass DlgClass"
    (in definition script

两行代码(1代表生成消息,前面代码代码)是:

puts "info object isa class DlgClass is:[info object isa class DlgClass]"
superclass DlgClass

我不明白。第一行输出(info object isa class DlgClass is:1)是否表明超类确实定义了?

2 个答案:

答案 0 :(得分:1)

TclOO定义非常强烈地关注当前堆栈帧是什么,因为oo::define命令在内部调用帧结构中使用私有变量来存储正在定义的类的标识。出于某种原因(我发现有点令人惊讶)source命令干扰了这一点。

可能最有效的解决方法是编写自己的解决方法。幸运的是,您可以将它放在正确的命名空间中,并让它在您真正需要它的地方工作:

# Very simple version of the standard [source] command
proc ::oo::define::source {filename} {
    set f [open $filename]
    set script [read $f]
    close $f

    tailcall eval $script
}

另一方面,即使没有source的特殊版本,当我尝试时,你的脚本也适用于我。还有其他事情正在发生。

答案 1 :(得分:0)

显然,当我从类块中对超类的定义进行惰性求值时会发生这种情况。 即 而不是写作:

oo::class create foo {
   source "DlgClass.tcl" ;# if needed
   superclass DlgClass
}

需要做的事情:

source "DlgClass.tcl" ;# if needed
oo::class create foo {
   superclass DlgClass
}

然后它有效。我认为它可能是oo :: class / tcl引擎中的一个错误,但是,因为它很容易解决,而不是主要的。