2015-09-25 27 views
0

我已經使用一個類變量的以下兩個版本:

::itcl::class Subcase { 
    variable _id 
} 

::itcl::class Subcase { 
    variable _id -1 
} 

顯然,只有明顯的差別,在於前者沒有初始值。 當我使用我的訪問器,其定義爲:

public method ::hwascii::Subcase::Id {{newValue __keep__}} { if {$newValue != "__keep__"} { set _id $newValue }; return [set _id] } 

先設定,然後回來這個值,我會得到兩個不同的行爲,具體取決於哪個版本上面我已經習慣了聲明變量。 在第一個未初始化的情況下,訪問將總是拋出:

can't read "_id": no such variable 

但與第二個聲明,它將按預期工作,返回任何初始值,或者如果它已經改變,新的價值。

注1:通過我的訪問設定值始終有效。

s info variable _id 

將報告

protected variable ::hwascii::Subcase::_id -1 42 

protected variable ::hwascii::Subcase::_id <undefined> 42 

取決於我是否有初始化版本與否。

注2: 訪問器是一個單線程,因爲它是在一個proc中生成的,它使用concat和uplevel來生成一種「默認」訪問器。

注3: 我的TCL的版本是8.5 ITCL的我的版本是3.4 都無法改變

問: 我有一個有效的解決方案了,但想了解有什麼區別。一個很好的解釋會回答我的問題,一個指向一個好的文檔也將是不錯的,但obvisously一個鏈接:

http://www.tcl.tk/man/tcl8.6/Itcl4.0.0Cmd/class.htm#M22 

或更一般不會做。

回答

0

TCL將不會從沒有被設置爲定義的值變量中讀取,而會拋出您收到的錯誤。 (在執行層面上,未設置變量相當於一個NULL和一貫當您嘗試讀取它產生一個錯誤,這是不可能捕獲的錯誤,並處理它,當然)。如果你沒有設置值 - 如通過variable聲明 - 變量嚴格存在(即,它具有存儲空間和元數據分配),但沒有任何內容,因此當您讀取它時會出現錯誤。如果需要,您可以在方法內部使用info exists _id來檢測這種情況;根據長期的政策,腳本不應該能夠看到存在但無價值和不存在的所有狀態。

ITCL使用Tcl的基本變量的基礎設施。它改變了Tcl在運行內部方法(變量解析機制)時如何查找變量,但之後的一切都是純粹的標準Tcl行爲。無值的變量不能讀取,並假裝根本不存在。 (事實上​​,如果不是Itcl做一些特殊的技巧,這個變量就完全不存在,因爲這是對內存資源更有效的利用。)

+0

感謝這個解釋。雖然我還沒有完全明白我的問題。爲什麼變量沒有在賦值之後定義,並且可以使用「info變量」返回值? – Ingo

+0

我編輯了我的問題,使其更加明顯,我在設置變量之前嘗試獲取值。 – Ingo

+0

不,變量_is_在賦值後定義。我將你的代碼複製到解釋器中(糾正類名)。它完全按照預期工作。 –