2012-04-05 1 views
4

Ich warWie konvertiere ich/konvertiere ich einen String in einen bool in Tcl?

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

erwarten wahr Evaluierungs- und einfach so schnell wie some_func kehrt einige String zu arbeiten. Es gibt jedoch Fehler.

es auf die harte Tour lernen, nimmt Tcl nur die

  • leeren String -> False
  • 0 -> False
  • false -> False
  • true -> True
  • 1 -> True

Um genau zu sein:

% 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 $ 

Es scheint expr normalisiert es ist der Rückgabewert. Beachten Sie insbesondere das leere String-Ergebnis, wenn eine leere Zeichenfolge angegeben wird.

Also, wie konvertiere ich einfach Strings in booleans?

+0

Streng genommen gibt es eine kleine Menge von Strings, die als boolesche interpretierbar angesehen werden; die anderen Möglichkeiten ... sind nicht. Wenn das nicht genug ist, würde ich nur ermutigen, darüber nachzudenken, was du wirklich meinst; Welche Art von Test willst du wirklich? –

Antwort

3

Nach etwas mehr zu denken, und auf der Suche etwas mehr, soll die Antwort wahrscheinlich:

Mit meinem Perl-Hintergrund „Es hängt davon ab:“ Ich erwarte, etwas ähnliches Perl. Mein Fehler.

In Tcl string is true scheint die offizielle Besetzung Funktion zu sein. Gültige Zeichenketten für das Gießen sind defined here:

Wenn Zeichenfolge ist eine von 0, falsch, nein, oder ausgeschaltet ist, dann Tcl_GetBoolean speichert einen Nullwert an * boolPtr. Wenn string 1, true, yes oder on ist, wird 1 bei * boolPtr gespeichert. Jeder dieser Werte kann abgekürzt werden, und Groß- Schreibweisen sind auch akzeptabel

In meinem Fall ist es mir nicht über den Inhalt der Zeichenfolge so kann ich nur

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

Eine weitere Möglichkeit, dies schreiben auch viel einfacher:

if {[some_func $some_args] != {}} { 
    ... 
} 
+0

Ja, das ist die richtige Antwort. Seit 8.4 kann man auch 'if {[some_func $ some_args] ne" "}' schreiben, was etwas weniger "qurly-bracey" ist. – kostix

+2

Ich würde auch bemerken, dass ich empfinde, dass Tcl's Art, mit Booleans umzugehen, vernünftiger ist als das, was man in Perl und PHP mit ihren idiotischen Typumwandlungen findet. Der einzige Tcl-Fehler in diesem Spielort ist das gefürchtete [oktale Problem] (http://wiki.tcl.tk/498) welches hoffentlich in 9.0 gelöst wird ;-) – kostix

+1

@kostix: +1 [_Ceterum censeo octal numero esse delendam._] (http://www.tcl.tk/cgi-bin/tct/tip/114.html) –

1

aus der Sicht des Benutzers, Tcl „cast“ Werte von einem Typ zum anderen nicht die Möglichkeit haben, oder müssen. Vielmehr ist alles eine Zeichenfolge und Sie fragen "Kann dieser Wert als ein interpretiert werden?" Zum Beispiel:

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 

Es gibt auch einige [string is] Unterbefehle, die für bestimmte Werte zu überprüfen, aber das ist meist für die Bequemlichkeit. Zum Beispiel:

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

Also, was gesagt wird, dass die Saiten als wahr haben variieren im Laufe der Zeit interpretiert werden kann, wenn ich mich richtig erinnere. Meine Empfehlung ist, immer "wahr" oder "falsch" zu verwenden, da alle Versionen von Tcl (glaube ich) sie als boolesch erkennen und sie genau die Absicht darstellen, dass sie boolesch ist (was ich nicht glaube 1/0 tun).

Wenn das, was du wirklich versucht zu tun, herauszufinden, ob Sie eine Zeichenfolge mit den tatsächlichen Inhalt in ihm haben, dann benutzen Sie einfach:

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

Wenn das, was Sie versuchen, eine andere zu tun ist, emulieren Sprachversion der Wahrheit, dann wäre meine Empfehlung tun Sie das nicht. Sicher, Sie können, über

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

aber das ist wahrscheinlich nicht der richtige Weg zu gehen.

+0

Unter den Deckeln macht Tcl eigentlich all diese Art Conversion-Zeug. Dies wird jedoch als ein Merkmal der Implementierung und nicht der Sprache betrachtet. Die Tcl_language_ ist nicht typisiert. –

+0

Daher der Ausdruck "Aus der Sicht des Benutzers" :) – RHSeeger