och, miło, miałem właśnie zadać to samo pytanie, chociaż moje pytanie dotyczyłoby javascript / as3 lub ogólnie ECMAScript, jak sądzę ... które z łatwością można ująć w to pytanie.
To ... naprawdę oczywiste - ups! Nie wiem, dlaczego o tym nie pomyślałem. Dzięki.
Kevin Griffin
! Boolean wydaje się naturalnym wyborem - może w przyszłości.
matt lohkamp
21
@ypnos: !!bool == !(!(bool)) == bool.
Christoffer Hammarström
12
@ ChristofferHammarström Zgodnie z tą logiką nie powinno --integer == - (- (liczba całkowita)) == liczba całkowita?
user515655,
1
@ user515655 - Język definiuje --operatora (w rzeczywistości dwóch z nich wraz z dwoma ++operatorami), ale nie definiuje !!operatora. Jeśli chcesz -(-(integer)), możesz użyć spacji między dwoma -znakami. Ale !!parsuje jako dwa !operatory niezależnie od białych znaków.
Ted Hopp
164
theBoolean ^=true;
Mniej naciśnięć klawiszy, jeśli zmienna ma więcej niż cztery litery
Edycja : kod zwykle zwraca przydatne wyniki, gdy jest używany jako wyszukiwane hasło Google. Powyższy kod nie. Dla tych, którzy go potrzebują, jest to bitowy XOR, jak opisano tutaj .
teraz przechodzę do XOR-up-name-drop-drop-syntax-drop ?, żeby wyglądać fajnie przed moimi programistami. Twoja odpowiedź powinna zostać połączona z wybraną, razem są czystą doskonałością.
matt lohkamp
6
@ScottStanchfield Tacy ludzie powinni się tego nauczyć. To wcale nie jest trudne, nie jest hackowaniem, a nie wiedząc, że często prowadzi do gównianego kodu, jak np. To pytanie. To jest prawdziwy wysadzenie - pięć linii przy użyciu standardowych konwencji!
„Najbardziej wizualny” sposób (najbardziej niepewny)
theBoolean = theBoolean ?false:true;
Dodatkowo: Przełącz i używaj w wywołaniu metody
theMethod( theBoolean ^=true);
Ponieważ operator przypisania zawsze zwraca to, co zostało przypisane, spowoduje to przełączenie wartości za pomocą operatora bitowego, a następnie zwróci nowo przypisaną wartość do użycia w wywołaniu metody.
Zawiń implementację w funkcję / metodę o nazwie toggle, a wtedy prawie nie ma sposobu, aby ją pomylić.
Lambage
@ Reeiner: Na Cpewno, ale w Javanim nie wolno mieszać wartości logicznych i całkowitych (również takie rzeczy while(1)nie są możliwe w Javie).
Lewita
@Lambage: To prawda, ale z drugiej strony nie można przełączać wartości logicznej, po prostu przekazując ją, ponieważ nie można przekazywać prymitywów przez referencję w Javie. Trzeba będzie ponownie przypisać wynik metody do zmiennej lub w inny sposób utworzyć klasę opakowania dla wartości logicznej.
Lewita
„Oczywisty sposób” powyżej został oznaczony przez SONAR przy pomocy - Należy unikać przypisań wewnętrznych.
Orby
2
Jeśli używasz boolowskich wartości NULL i uznajesz je za fałszywe, spróbuj tego:
Dobre podejście, ale nie całkowicie jednoznaczne (imho). Dla kogoś, kto używa / czyta tylko „przełącznik (..)”, może pomyśleć, wywołanie metody (bez przypisywania jej ponownie do zmiennej) może już przełączyć zmienną bazową. Teraz jest dla nas oczywiste, że widzimy kod, ale w prawdziwym życiu może być dość trudny do debugowania. Lepszą nazwą metody może być „przeciwieństwo” lub ewentualnie „negacja”, aby uczynić to nieco bardziej oczywistym; lub użyj pierwszego podejścia z obiektem Booleani naprawdę przełącz go w ramach metody (ale nadal nieco niejednoznacznej).
Lewita
2
Ta odpowiedź pojawiła się podczas wyszukiwania „jaolowej inwertowanej funkcji boolean”. Poniższy przykład zapobiegnie niepowodzeniom niektórych narzędzi analizy statycznej z powodu logiki rozgałęziania. Jest to przydatne, jeśli trzeba odwrócić wartość logiczną i nie opracowano kompleksowych testów jednostkowych;)
następnie po prostu utwórz obiekt Util
Util u = new Util();
i coś do zwrotuSystem.out.println( u.flip(bool) );
Jeśli będziesz używać tej samej metody w kółko, użyj metody, a zwłaszcza, jeśli dotyczy to różnych projektów, stwórz klasę Util. Nie wiem jednak, jaki jest standard branżowy. (Doświadczeni programiści mogą mnie poprawić)
Kto kiedykolwiek przegłosował? Czy możesz również wyjaśnić powód?
Nikhil Kumar
11
Dwa główne powody, dla których mogę wymyślić, dlaczego ktoś cię ocenił: 1) Nekromancja wątku ( daj spokój ! Pytanie zostało zadane 7 (!) Lat temu! ) I twoja odpowiedź nie wnosi nic nowego do stołu; 2) Wyborca oczekiwał czegoś „czystszego” ( czytaj: krótszy ) - odpowiedź AaronaMaenpaa jest tego najlepszym przykładem.
Priidu Neemre
5
@Elltz: Wręcz przeciwnie - głosowałem go, ponieważ odpowiedź była technicznie poprawna. Muszę jednak powiedzieć, że nie podoba mi się trend polegający na tym, że bootlegging odpowiedzi poprzednich użytkowników na tanią karmę (patrz odpowiedź nlaq).
Priidu Neemre
@PriiduNeemre, pytanie zadane i odpowiedź zaakceptowane przed 7+ latami i czy uważasz, że poza listą ktoś da głos? poza tym twoja odpowiedź również nie jest do znaku .. :(
Odpowiedzi:
źródło
!!bool == !(!(bool)) == bool
.--
operatora (w rzeczywistości dwóch z nich wraz z dwoma++
operatorami), ale nie definiuje!!
operatora. Jeśli chcesz-(-(integer))
, możesz użyć spacji między dwoma-
znakami. Ale!!
parsuje jako dwa!
operatory niezależnie od białych znaków.Mniej naciśnięć klawiszy, jeśli zmienna ma więcej niż cztery litery
Edycja : kod zwykle zwraca przydatne wyniki, gdy jest używany jako wyszukiwane hasło Google. Powyższy kod nie. Dla tych, którzy go potrzebują, jest to bitowy XOR, jak opisano tutaj .
źródło
theBoolean = !theBoolean;
lubtheBoolean = theBoolean ? false : true;
Istnieje kilka
„Oczywisty” sposób (dla większości osób)
„Najkrótsza” droga (przez większość czasu)
„Najbardziej wizualny” sposób (najbardziej niepewny)
Dodatkowo: Przełącz i używaj w wywołaniu metody
Ponieważ operator przypisania zawsze zwraca to, co zostało przypisane, spowoduje to przełączenie wartości za pomocą operatora bitowego, a następnie zwróci nowo przypisaną wartość do użycia w wywołaniu metody.
źródło
C
pewno, ale wJava
nim nie wolno mieszać wartości logicznych i całkowitych (również takie rzeczywhile(1)
nie są możliwe w Javie).Jeśli używasz boolowskich wartości NULL i uznajesz je za fałszywe, spróbuj tego:
Jeśli nie przekazujesz boolowskich wartości NULL, spróbuj tego:
Są to najczystsze, ponieważ pokazują intencję w metodzie, są łatwiejsze do odczytania w porównaniu do ! operatora i można go łatwo debugować.
Stosowanie
Oczywiście, jeśli używasz Groovy lub języka, który pozwala na metody rozszerzeń, możesz zarejestrować rozszerzenie i po prostu zrobić:
źródło
Boolean
i naprawdę przełącz go w ramach metody (ale nadal nieco niejednoznacznej).Ta odpowiedź pojawiła się podczas wyszukiwania „jaolowej inwertowanej funkcji boolean”. Poniższy przykład zapobiegnie niepowodzeniom niektórych narzędzi analizy statycznej z powodu logiki rozgałęziania. Jest to przydatne, jeśli trzeba odwrócić wartość logiczną i nie opracowano kompleksowych testów jednostkowych;)
lub alternatywnie:
lub
źródło
Boolean.FALSE::equals
do funkcji mapowania zamiast pisać małą lambdaJeśli nie robisz nic szczególnie profesjonalnego, zawsze możesz skorzystać z klasy Util. Ex, klasa util z projektu dla klasy.
następnie po prostu utwórz obiekt Util
Util u = new Util();
i coś do zwrotuSystem.out.println( u.flip(bool) );
Jeśli będziesz używać tej samej metody w kółko, użyj metody, a zwłaszcza, jeśli dotyczy to różnych projektów, stwórz klasę Util. Nie wiem jednak, jaki jest standard branżowy. (Doświadczeni programiści mogą mnie poprawić)
źródło
Klasa
BooleanUtils
popiera negację wartości logicznej. Znajdziesz tę klasę w commons-lang: commons-langźródło
Przed:
Po:
źródło