2017-05-24 66 views
1

當我運行我(專有的)代碼,我得到這樣的:TCL OO產量沒有指向對象

 
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之一)是否表明超類的確定了?

回答

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引擎中的一個錯誤,但是,由於它很容易解決,而不是主要的解決方案。

+1

TclOO定義命令非常關心當前堆棧幀是什麼。我不記得'源'是否會影響到它,但它可能會。我必須檢查... –

+1

另外,類需要在可以使用之前創建,並且在查找類時不會嘗試支持調用'unknown'命令處理程序,所以懶惰的定義不會輕鬆工作。但是,如果你願意,你可以懶惰地做他們方法的定義; 'oo :: define'命令就是這個工具(並且'未知'方法也可能是相關的)。 –

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的特殊版本。其他事情正在發生。