oh bagus, saya akan mengajukan pertanyaan yang sama, meskipun pertanyaan saya sudah spesifik untuk javascript / as3, atau ECMAScript secara umum saya kira ... yang dengan mudah akan dibahas oleh pertanyaan ini.
Itu ... sangat jelas — oops! Tidak tahu mengapa saya tidak memikirkannya. Terima kasih.
Kevin Griffin
Boolean sepertinya pilihan alami - mungkin di masa depan.
matt lohkamp
21
@ypnos: !!bool == !(!(bool)) == bool.
Christoffer Hammarström
12
@ ChristofferHammarström Dengan logika itu, maka seharusnya tidak --integer == - (- (integer)) == integer?
user515655
1
@ user515655 - Bahasa mendefinisikan --operator (sebenarnya, dua dari mereka, bersama dengan dua ++operator), tetapi tidak mendefinisikan !!operator. Jika mau, -(-(integer))Anda dapat menggunakan ruang putih di antara dua -karakter. Tetapi !!diurai sebagai dua !operator terlepas dari ruang putih.
Ted Hopp
164
theBoolean ^=true;
Lebih sedikit penekanan jika variabel Anda lebih panjang dari empat huruf
Sunting : kode cenderung memberikan hasil yang bermanfaat ketika digunakan sebagai istilah pencarian Google. Kode di atas tidak. Bagi mereka yang membutuhkannya, itu XOR bitwise seperti yang dijelaskan di sini .
sekarang saya bisa dengan mudahnya memberi nama-drop (sintaks-drop?) XOR agar terlihat keren di depan teman-teman programmer saya. Jawaban Anda harus digabung dengan yang dipilih, bersama-sama mereka murni kesempurnaan.
matt lohkamp
6
@ScottStanchfield Orang-orang seperti itu harus mempelajarinya. Tidak sulit sama sekali, tidak ada peretasan, dan tidak mengetahuinya sering menyebabkan kode jelek seperti misalnya satu pertanyaan ini. Ini adalah ledakan nyata - lima baris menggunakan konvensi standar!
maaartinus
4
Operasi ini juga 12% lebih cepat daripada versi lain seperti theBoolean = !theBoolean;atautheBoolean = theBoolean ? false : true;
Blaine Kasten
32
Ada beberapa
Cara "jelas" (bagi kebanyakan orang)
theBoolean =!theBoolean;
Cara "terpendek" (sebagian besar waktu)
theBoolean ^=true;
Cara "paling visual" (paling tidak pasti)
theBoolean = theBoolean ?false:true;
Ekstra: Beralih dan digunakan dalam pemanggilan metode
theMethod( theBoolean ^=true);
Karena operator penugasan selalu mengembalikan apa yang telah ditetapkan, ini akan beralih nilai melalui operator bitwise, dan kemudian mengembalikan nilai yang baru ditugaskan untuk digunakan dalam pemanggilan metode.
Bungkus implementasi dalam fungsi / metode yang disebut toggle dan kemudian hampir tidak ada cara untuk membingungkannya.
Lambage
@ Reiner: Untuk yang Cpasti, tetapi di Javadalamnya tidak diizinkan untuk mencampur boolean dan integer (juga hal-hal seperti while(1)tidak mungkin di Jawa).
Levite
@Lambage: Benar, tetapi pada sisi negatifnya Anda tidak dapat beralih boolean hanya dengan melewatkannya, karena tidak mungkin untuk melewati primitif dengan referensi di Jawa. Anda harus menugaskan kembali hasil metode ke variabel Anda, atau membuat kelas pembungkus untuk boolean.
Levite
"Cara yang jelas" di atas ditandai oleh SONAR dengan - Tugas dalam harus dihindari.
Orby
2
Jika Anda menggunakan nilai Boolean NULL dan menganggapnya salah, coba ini:
Ini adalah yang terbersih karena mereka menunjukkan maksud dalam metode tanda tangan, lebih mudah dibaca dibandingkan dengan ! operator, dan dapat dengan mudah didebug.
Pendekatan yang baik, tetapi tidak sepenuhnya ambigu (imho). Untuk seseorang yang menggunakan / membaca hanya "toggle (..)" mungkin berpikir, memanggil metode (tanpa menetapkannya lagi ke variabel) mungkin sudah beralih variabel yang mendasarinya. Jelas bagi kami saat ini melihat kode, tetapi dalam kehidupan nyata mungkin cukup sulit untuk debug. Nama metode yang lebih baik mungkin "berlawanan" atau mungkin "negasi", untuk membuatnya lebih jelas; atau gunakan pendekatan pertama dengan objek Booleandan benar-benar beralih dalam metode (tetapi masih agak ambigu).
Levite
2
Jawaban ini muncul ketika mencari "fungsi java invert boolean". Contoh di bawah ini akan mencegah alat analisis statis tertentu gagal membangun karena logika percabangan. Ini berguna jika Anda perlu membalikkan boolean dan belum membangun unit test yang komprehensif;)
kemudian hanya membuat objek Util
Util u = new Util();
dan punya sesuatu untuk kembaliSystem.out.println( u.flip(bool) );
Jika Anda akan berakhir menggunakan hal yang sama berulang-ulang, gunakan metode, dan terutama jika itu lintas proyek, buat kelas Util. Entah apa standar industri. (Pemrogram berpengalaman merasa bebas untuk memperbaiki saya)
Siapa yang pernah memilih? Bisakah Anda jelaskan alasannya juga?
Nikhil Kumar
11
Dua alasan utama yang dapat saya pikirkan mengapa seseorang mungkin menurunkan Anda: 1) Thread necromancy ( ayolah! Pertanyaannya diajukan 7 (!) Tahun yang lalu! ) & Jawaban Anda tidak membawa sesuatu yang baru ke meja; 2) Pemilih mengharapkan sesuatu yang "bersih" ( baca: lebih pendek ) - Jawaban AaronMaenpaa adalah contoh utama dari ini.
Priidu Neemre
5
@ Elltz: Sebaliknya - saya benar-benar telah mengangkatnya, karena secara teknis jawabannya benar. Namun, saya harus mengatakan bahwa saya tidak menikmati tren pembajakan balasan pengguna sebelumnya untuk karma murah (lihat jawaban nlaq).
Priidu Neemre
@PriiduNeemre, pertanyaan yang diajukan & jawaban diterima sebelum 7+ tahun & apakah Anda pikir kecuali dari daftar siapa pun yang akan memberikan suara positif? Terlepas dari ini, jawaban Anda juga tidak sesuai dengan sasaran .. :(
Jawaban:
sumber
!!bool == !(!(bool)) == bool
.--
operator (sebenarnya, dua dari mereka, bersama dengan dua++
operator), tetapi tidak mendefinisikan!!
operator. Jika mau,-(-(integer))
Anda dapat menggunakan ruang putih di antara dua-
karakter. Tetapi!!
diurai sebagai dua!
operator terlepas dari ruang putih.Lebih sedikit penekanan jika variabel Anda lebih panjang dari empat huruf
Sunting : kode cenderung memberikan hasil yang bermanfaat ketika digunakan sebagai istilah pencarian Google. Kode di atas tidak. Bagi mereka yang membutuhkannya, itu XOR bitwise seperti yang dijelaskan di sini .
sumber
theBoolean = !theBoolean;
atautheBoolean = theBoolean ? false : true;
Ada beberapa
Cara "jelas" (bagi kebanyakan orang)
Cara "terpendek" (sebagian besar waktu)
Cara "paling visual" (paling tidak pasti)
Ekstra: Beralih dan digunakan dalam pemanggilan metode
Karena operator penugasan selalu mengembalikan apa yang telah ditetapkan, ini akan beralih nilai melalui operator bitwise, dan kemudian mengembalikan nilai yang baru ditugaskan untuk digunakan dalam pemanggilan metode.
sumber
C
pasti, tetapi diJava
dalamnya tidak diizinkan untuk mencampur boolean dan integer (juga hal-hal sepertiwhile(1)
tidak mungkin di Jawa).Jika Anda menggunakan nilai Boolean NULL dan menganggapnya salah, coba ini:
Jika Anda tidak memberikan nilai Boolean NULL, coba ini:
Ini adalah yang terbersih karena mereka menunjukkan maksud dalam metode tanda tangan, lebih mudah dibaca dibandingkan dengan ! operator, dan dapat dengan mudah didebug.
Pemakaian
Tentu saja, jika Anda menggunakan Groovy atau bahasa yang memungkinkan metode ekstensi, Anda dapat mendaftarkan ekstensi dan cukup lakukan:
sumber
Boolean
dan benar-benar beralih dalam metode (tetapi masih agak ambigu).Jawaban ini muncul ketika mencari "fungsi java invert boolean". Contoh di bawah ini akan mencegah alat analisis statis tertentu gagal membangun karena logika percabangan. Ini berguna jika Anda perlu membalikkan boolean dan belum membangun unit test yang komprehensif;)
atau sebagai alternatif:
atau
sumber
Boolean.FALSE::equals
ke fungsi pemetaan alih-alih menulis lambda kecilJika Anda tidak melakukan sesuatu yang sangat profesional, Anda selalu dapat menggunakan kelas Util. Mis, kelas util dari proyek untuk kelas.
kemudian hanya membuat objek Util
Util u = new Util();
dan punya sesuatu untuk kembaliSystem.out.println( u.flip(bool) );
Jika Anda akan berakhir menggunakan hal yang sama berulang-ulang, gunakan metode, dan terutama jika itu lintas proyek, buat kelas Util. Entah apa standar industri. (Pemrogram berpengalaman merasa bebas untuk memperbaiki saya)
sumber
Kelas
BooleanUtils
mendukung negasi dari boolean. Anda menemukan kelas ini di commons-lang: commons-langsumber
Sebelum:
Setelah:
sumber