2013-07-29 58 views

回答

3

你這樣做是錯誤的(忽略你的事實在您的if條件表達式中使用裸字isSet將不起作用)。相反,做

proc test {{isSet "false"}} { 
    if {$isSet} { 
     # do something 
    } 
} 

這將允許你打電話給你test PROC但是你想:

test 0 
test 1 
test [expr {1 == 0}] 
test yes 
test false 
test "no" 
test {true} 
test "off" 

等…

其基本思想是,Tcl解釋將嘗試解釋包含在isSet變量作爲布爾類型的值的值;有一套規則可以做到這一點:

  • 整數類型的值0爲false。
  • 與整數類型的0不同的值爲true。
  • 其他一切首先被轉換爲一個字符串,然後
    • 的字符串字面等於yestrueon條件之一;
    • 字面上等於no,falseoff之一的字符串是錯誤的。

施加用於解釋的字符串作爲布爾值的規則在Tcl_GetBoolean() manual中描述。

你正在做在你的假設另一個錯誤:TCL沒有明確的字符串和布爾類型(因爲它是無類型),所以"false"false是完全一樣的事情,當時的Tcl解釋它分析你的腳本在Tcl 中使用雙引號和大括號來分組,不用於指定文字類型(而Tcl沒有文字)。所以我建議從the tutorial開始,以便更好地掌握這些想法。我提到

的類型,當我描述的值解釋爲布爾是內部的Tcl值,且用戶不可見—是,內部的Tcl緩存,所以當你做set x [expr {1 + 2}],內部價值分配到相應值的「原生」表示x將有一個整數類型,但這實際上是一個實現細節。

+0

+1另一種可能性是使用'string is boolean','string is true'和'string false''在某些組合中。我會注意到,它們在解析用戶值時非常有用(其中「you betcha!」是輸入的明顯可能性),而不是來自程序的值。 –

相關問題