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

tcl OO yields does not refer to an object when referring to an object

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

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

两行代码(第一行生成消息,前一行)是:

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

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

显然,当我对 class 块中的 superclass' 定义进行惰性求值时,就会发生这种情况。 IE。 而不是写:

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 引擎中的一个错误,但是,由于它很容易解决,所以不是主要错误。

TclOO 定义非常关心当前堆栈帧是什么,因为 oo::define 命令在内部调用帧结构中使用私有变量来存储正在定义的 class 的标识。出于某种原因(我觉得有点奇怪)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。其他事情正在发生。