2015-06-23 43 views
0

我想從configbody返回,但不能在不導致變量未被設置的情況下顯式地返回。Itcl configbody的適當返回值

我想幫助理解我所看到的行爲。請考慮(使用Itcl 3.4)下面的代碼:

package require Itcl 
catch {itcl::delete class Model} 
itcl::class Model { 
    public variable filename "orig" 
} 

itcl::configbody Model::filename { 
    if 1 { 
     return "" 
    } else { 
    } 
} 

Model my_model 
my_model configure -filename "newbie" 
puts "I expect the result to be 'newbie:' [my_model cget -filename]" 

當我返回空字符串,文件名沒有被設置爲新值。如果我不回來,但只是允許proc通過,文件名確實會改變。你可以通過在上面的代碼中將1更改爲0來看到這一點。

我懷疑它涉及到以下statement

當在一個腳本沒有返回,它的價值是在腳本評估的最後一個命令的值。

如果有人會解釋這種行爲和我應該如何返回,我會很感激的幫助。

回答

1

Tcl通過拋出異常(類型TCL_RETURN)處理return。通常情況下,過程或方法處理程序的外部部分會攔截該異常並將其轉換爲過程/方法的正常結果,但您可以使用catch截取某些內容並在封面下方查看。

但是,configbody不使用該機制。它只是在某些上下文中運行腳本(不知道是什麼!),並且該上下文將TCL_RETURN視爲失敗更新的指示。

解決方法:

itcl::configbody Model::filename { 
    catch { 
     if 1 { 
      return "" 
     } else { 
     } 
    } msg; set msg 
    # Yes, that's the single argument form of [set], which READS the variable... 
} 

或致電在configbody一個真正的方法,傳遞的需要的任何信息。