0

私はこのような機能を持っています:

proc test { {isSet "false"} } {
   if {isSet  == "true"} {
    # do something
   }
}

falseしかし、このプロシージャを呼び出すとき、またはを渡す方法true:

test "false" or test false?
4

1 に答える 1

3

あなたはそれを間違っています(isSet条件if式で裸の単語を使用しているという事実を無視しますが、これは機能しません)。代わりに

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

testこれにより、好きなようにプロシージャを呼び出すことができます。

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

等…

基本的な考え方は、Tcl インタープリターが変数に含まれる値をブール型の値として解釈しようとすることです。isSetそれを行うための一連のルールがあります。

  • 整数型の値 0 は false です。
  • 整数型の 0 以外の値は true です。
  • それ以外はすべて最初に文字列に変換され、次に
    • のいずれかと文字通り等しい文字列yestrueまたはontrue です。
    • またはの 1 つnoに文字通り等しい文字列は false です。falseoff

文字列をブール値として解釈するために適用される規則は、Tcl_GetBoolean()マニュアルに記載されています。

そして、あなたはあなたの仮定に別の間違いを犯しています.Tclには明示的な文字列とブール型がないため(型がないため) 、スクリプトを二重引用符と中括弧として解析するときのTclインタープリターとまったく同じです"false"。リテラルの型を指定するためではなく、グループ化のためfalseに Tcl で使用されます (Tcl にはリテラルがありません)。したがって、これらのアイデアをよりよく理解するために、チュートリアルから始めることをお勧めします。

値のブール値としての解釈について説明したときに言及した型は、Tcl 値の内部にあり、ユーザーには表示されません。はい、内部的に Tcl は値の「ネイティブ」表現をキャッシュするためset x [expr {1 + 2}]、内部的に割り当てられた値xは整数型になります。しかし、これは実際には実装の詳細です。

于 2013-07-29T16:22:23.657 に答える