Oh, schön, ich wollte gerade die gleiche Frage stellen, obwohl meine Frage spezifisch für Javascript / as3 oder ECMAScript im Allgemeinen gewesen wäre, nehme ich an ... was von dieser Frage leicht abgedeckt wird.
Das ist ... wirklich offensichtlich - oops! Ich weiß nicht, warum ich nicht daran gedacht habe. Vielen Dank.
Kevin Griffin
! Boolean scheint eine natürliche Wahl zu sein - vielleicht in der Zukunft.
Matt Lohkamp
21
@ypnos : !!bool == !(!(bool)) == bool.
Christoffer Hammarström
12
@ ChristofferHammarström Nach dieser Logik sollte dann nicht --integer == - (- (integer)) == integer?
user515655
1
@ user515655 - Die Sprache definiert einen --Operator (tatsächlich zwei davon zusammen mit zwei ++Operatoren), definiert jedoch keinen !!Operator. Wenn Sie möchten -(-(integer)), können Sie Leerzeichen zwischen den beiden -Zeichen verwenden. Aber !!Parsen als zwei !Betreiber unabhängig von Leerraum.
Ted Hopp
164
theBoolean ^=true;
Weniger Tastenanschläge, wenn Ihre Variable länger als vier Buchstaben ist
Bearbeiten : Code liefert in der Regel nützliche Ergebnisse, wenn er als Google-Suchbegriffe verwendet wird. Der obige Code funktioniert nicht. Für diejenigen, die es brauchen, ist es bitweises XOR wie hier beschrieben .
Jetzt kann ich nebenbei Name-Drop (Syntax-Drop?) XOR verwenden, um vor meinen Programmiererfreunden cool auszusehen. Ihre Antwort sollte mit der auserwählten verschmolzen werden, zusammen sind sie reine Perfektion.
Matt Lohkamp
6
@ScottStanchfield Solche Leute sollten es lernen. Es ist überhaupt nicht schwer, es ist kein Hack, und nicht zu wissen, dass es oft zu beschissenem Code führt, wie z. B. derjenige, der diese Frage stellt. Dies ist eine echte Explosion - fünf Zeilen nach den Standardkonventionen!
Der "offensichtliche" Weg (für die meisten Menschen)
theBoolean =!theBoolean;
Der "kürzeste" Weg (meistens)
theBoolean ^=true;
Der "visuellste" Weg (am unsichersten)
theBoolean = theBoolean ?false:true;
Extra: Umschalten und in einem Methodenaufruf verwenden
theMethod( theBoolean ^=true);
Da der Zuweisungsoperator immer das zurückgibt, was zugewiesen wurde, wird der Wert über den bitweisen Operator umgeschaltet und anschließend der neu zugewiesene Wert zurückgegeben, der im Methodenaufruf verwendet werden soll.
Wickeln Sie die Implementierung in eine Funktion / Methode namens toggle ein, und dann gibt es fast keine Möglichkeit, sie zu verwirren.
Lambage
@ Reiner: Auf Cjeden Fall, aber Javaes ist nicht erlaubt, Boolesche und Ganzzahlen zu mischen (auch Dinge wie while(1)sind in Java nicht möglich).
Levite
@Lambage: Stimmt, aber auf der anderen Seite können Sie einen Booleschen Wert nicht durch einfaches Übergeben umschalten, da es in Java nicht möglich ist, Grundelemente als Referenz zu übergeben. Sie müssten das Ergebnis der Methode Ihrer Variablen neu zuweisen oder auf andere Weise eine Wrapper-Klasse für den Booleschen Wert erstellen.
Levite
Der "offensichtliche Weg" oben wird von SONAR mit - gekennzeichnet. Innere Zuweisungen sollten vermieden werden.
Orby
2
Wenn Sie boolesche NULL-Werte verwenden und diese als falsch betrachten, versuchen Sie Folgendes:
Diese sind die saubersten, weil sie die Absicht in der Methodensignatur zeigen, sind leichter zu lesen als die ! Betreiber und kann leicht debuggt werden.
Wenn Sie Groovy oder eine Sprache verwenden, die Erweiterungsmethoden zulässt, können Sie natürlich eine Erweiterung registrieren und einfach Folgendes tun:
Guter Ansatz, aber nicht ganz eindeutig (imho). Für jemanden, der nur "toggle (..)" verwendet / liest, könnte der Aufruf der Methode (ohne sie erneut der Variablen zuzuweisen) die zugrunde liegende Variable bereits umschalten. Es ist für uns im Moment offensichtlich, den Code zu sehen, aber im wirklichen Leben könnte es ziemlich schwierig sein, ihn zu debuggen. Ein besserer Methodenname könnte "Gegenteil" oder möglicherweise "Negation" sein, um dies etwas offensichtlicher zu machen; oder verwenden Sie den ersten Ansatz mit einem Objekt Booleanund schalten Sie es wirklich innerhalb der Methode um (aber immer noch etwas mehrdeutig).
Levite
2
Diese Antwort wurde bei der Suche nach "Java Invert Boolean Function" angezeigt. Das folgende Beispiel verhindert, dass bestimmte statische Analysetools aufgrund der Verzweigungslogik fehlschlagen. Dies ist nützlich, wenn Sie einen Booleschen Wert invertieren müssen und keine umfassenden Komponententests erstellt haben;)
Ich mag die Tatsache, dass Sie Boolean.FALSE::equalszu einer Mapping-Funktion übergehen könnten , anstatt ein kleines Lambda zu schreiben
Patrick Parker
0
Wenn Sie nichts besonders Professionelles tun, können Sie immer eine Util-Klasse verwenden. Beispiel: Eine Util-Klasse aus einem Projekt für eine Klasse.
Dann erstellen Sie einfach ein Util-Objekt
Util u = new Util();
und haben etwas für die RückgabeSystem.out.println( u.flip(bool) );
Wenn Sie am Ende immer wieder dasselbe verwenden, verwenden Sie eine Methode, und erstellen Sie eine Util-Klasse, insbesondere wenn es sich um projektübergreifende Methoden handelt. Keine Ahnung, was der Industriestandard ist. (Erfahrene Programmierer können mich gerne korrigieren)
Wer hat jemals abgestimmt? Können Sie bitte auch den Grund erklären?
Nikhil Kumar
11
Zwei Hauptgründe, warum ich mir vorstellen kann, warum dich jemand herabgestimmt hat: 1) Thread-Nekromantie ( komm schon! Die Frage wurde vor 7 (!) Jahren gestellt! ) Und deine Antwort bringt nichts Neues auf den Tisch; 2) Der Wähler erwartete etwas " Saubereres " ( sprich : kürzer ) - Aaron Maenpaas Antwort ist ein Paradebeispiel dafür.
Priidu Neemre
5
@Elltz: Im Gegenteil - ich habe ihn tatsächlich positiv bewertet, da die Antwort technisch korrekt war. Ich muss jedoch sagen, dass ich den Trend nicht genieße, die Antworten früherer Benutzer für billiges Karma zu fälschen (siehe die Antwort von nlaq).
Priidu Neemre
@PriiduNeemre, Frage gestellt & Antwort vor mehr als 7 Jahren angenommen & denkst du, außer von deiner Liste wird jemand eine positive Bewertung abgeben? Abgesehen davon ist Ihre Antwort auch nicht bis zur Marke .. :(
Antworten:
quelle
!!bool == !(!(bool)) == bool
.--
Operator (tatsächlich zwei davon zusammen mit zwei++
Operatoren), definiert jedoch keinen!!
Operator. Wenn Sie möchten-(-(integer))
, können Sie Leerzeichen zwischen den beiden-
Zeichen verwenden. Aber!!
Parsen als zwei!
Betreiber unabhängig von Leerraum.Weniger Tastenanschläge, wenn Ihre Variable länger als vier Buchstaben ist
Bearbeiten : Code liefert in der Regel nützliche Ergebnisse, wenn er als Google-Suchbegriffe verwendet wird. Der obige Code funktioniert nicht. Für diejenigen, die es brauchen, ist es bitweises XOR wie hier beschrieben .
quelle
theBoolean = !theBoolean;
odertheBoolean = theBoolean ? false : true;
Es gibt einige
Der "offensichtliche" Weg (für die meisten Menschen)
Der "kürzeste" Weg (meistens)
Der "visuellste" Weg (am unsichersten)
Extra: Umschalten und in einem Methodenaufruf verwenden
Da der Zuweisungsoperator immer das zurückgibt, was zugewiesen wurde, wird der Wert über den bitweisen Operator umgeschaltet und anschließend der neu zugewiesene Wert zurückgegeben, der im Methodenaufruf verwendet werden soll.
quelle
C
jeden Fall, aberJava
es ist nicht erlaubt, Boolesche und Ganzzahlen zu mischen (auch Dinge wiewhile(1)
sind in Java nicht möglich).Wenn Sie boolesche NULL-Werte verwenden und diese als falsch betrachten, versuchen Sie Folgendes:
Wenn Sie keine booleschen NULL-Werte übergeben, versuchen Sie Folgendes:
Diese sind die saubersten, weil sie die Absicht in der Methodensignatur zeigen, sind leichter zu lesen als die ! Betreiber und kann leicht debuggt werden.
Verwendung
Wenn Sie Groovy oder eine Sprache verwenden, die Erweiterungsmethoden zulässt, können Sie natürlich eine Erweiterung registrieren und einfach Folgendes tun:
quelle
Boolean
und schalten Sie es wirklich innerhalb der Methode um (aber immer noch etwas mehrdeutig).Diese Antwort wurde bei der Suche nach "Java Invert Boolean Function" angezeigt. Das folgende Beispiel verhindert, dass bestimmte statische Analysetools aufgrund der Verzweigungslogik fehlschlagen. Dies ist nützlich, wenn Sie einen Booleschen Wert invertieren müssen und keine umfassenden Komponententests erstellt haben;)
oder alternativ:
oder
quelle
Boolean.FALSE::equals
zu einer Mapping-Funktion übergehen könnten , anstatt ein kleines Lambda zu schreibenWenn Sie nichts besonders Professionelles tun, können Sie immer eine Util-Klasse verwenden. Beispiel: Eine Util-Klasse aus einem Projekt für eine Klasse.
Dann erstellen Sie einfach ein Util-Objekt
Util u = new Util();
und haben etwas für die RückgabeSystem.out.println( u.flip(bool) );
Wenn Sie am Ende immer wieder dasselbe verwenden, verwenden Sie eine Methode, und erstellen Sie eine Util-Klasse, insbesondere wenn es sich um projektübergreifende Methoden handelt. Keine Ahnung, was der Industriestandard ist. (Erfahrene Programmierer können mich gerne korrigieren)
quelle
Die Klasse
BooleanUtils
unterstützt die Negation eines Booleschen Werts. Sie finden diese Klasse in commons-lang: commons-langquelle
Vor:
Nach dem:
quelle