4

私は期待していました

if {[some_func $some_args]} {
   ....
}

some_functrue を評価し、文字列を返すとすぐに機能します。ただし、エラーがあります。

苦労して学ぶと、Tcl は

  • 空文字列 -> False
  • 0 -> 偽
  • 偽 -> 偽
  • 真 -> 真
  • 1 -> 真

正確には:

% expr 1
1
% expr 0
0
% expr
wrong # args: should be "expr arg ?arg ...?"
% expr {{}}
% expr true
true
% expr false
false
% expr True
syntax error in expression "True": variable references require preceding $
% expr False
syntax error in expression "False": variable references require preceding $

expr戻り値を正規化していないようです。空の文字列が指定された場合、特に空の文字列の結果に注意してください。

では、文字列をブール値に簡単に変換するにはどうすればよいでしょうか。

4

2 に答える 2

3

もう少し考えて、もっと見てみると、答えはおそらく「場合による」となるはずです。

私の perl バックグラウンドでは、perl に似たものを期待していました。私のせいです。

Tclstring is trueでは公式のキャスト関数のようです。キャストに有効な文字列は次のように定義されています

string が 0、false、no、または off のいずれかの場合、Tcl_GetBoolean は *boolPtr にゼロの値を格納します。string が 1、true、yes、または on のいずれかの場合、1 が *boolPtr に格納されます。これらの値は省略可能で、大文字のスペルも使用できます

私の場合、文字列の内容は気にしないので、

if {[string length [some_func $some_args]] > 0} {
  ...
}

これを書く別の方法も、はるかに簡単です。

if {[some_func $some_args] != {}} {
  ...
}
于 2012-04-05T13:25:33.877 に答える
2

ユーザーの観点から見ると、Tcl には値をある型から別の型に "キャスト" する機能や必要はありません。むしろ、すべてが文字列であり、「この値を として解釈できますか?」と尋ねます。例えば:

set value 1
string is boolean $value
> 1
string is integer $value
> 1

set value true
string is boolean $value
> 1
string is integer $value
> 0

特定の値をチェックするサブコマンドもいくつかありますが[string is]、これは主に便宜上のものです。例えば:

string is true $value
# effectively equivalent to
expr {[string is boolean $value] && $value}  

そうは言っても、私の記憶が正しければ、真と解釈できる文字列は時間の経過とともに変化しています。私の推奨は、常に「true」または「false」を使用することです.Tclのすべてのバージョン(私が思う)はそれらをブール値として認識し、ブール値であるという意図を正確に表しています(1/0はそうではないと思います)。

本当にしようとしているのが、実際のコンテンツを含む文字列があるかどうかを調べることである場合は、次を使用してください。

if {[string length $value] > 0} { ....}

あなたがしようとしているのが、他の言語のバージョンの真実性をエミュレートすることである場合、私の推奨はそれをしないことです. もちろん、できます。

if { (![string is false $value]) && [string length $value] > 0 } { ... }

しかし、それはおそらく正しい方法ではありません。

于 2012-04-05T17:22:00.927 に答える