Saya tidak bisa memeriksa apakah suatu objek adalah boolean dengan mudah. Apakah ada yang seperti ini di Ruby?
true.is_a?(Boolean)
false.is_a?(Boolean)
Sekarang saya sedang melakukan ini dan ingin mempersingkatnya:
some_var = rand(1) == 1 ? true : false
(some_var.is_a?(TrueClass) || some_var.is_a?(FalseClass))
ruby
typechecking
Lance Pollard
sumber
sumber
Jawaban:
Cara paling sederhana yang dapat saya pikirkan:
sumber
Saya merasa ini ringkas dan mendokumentasikan diri sendiri:
Jika menggunakan Rails atau ActiveSupport, Anda bahkan dapat melakukan kueri langsung menggunakan
in?
Memeriksa semua nilai yang mungkin bukanlah sesuatu yang saya rekomendasikan untuk float, tetapi layak jika hanya ada dua nilai yang memungkinkan!
sumber
foo == true or foo == false
seseorang yang memberikan komentar.!!foo == foo
.Tidak ada
Boolean
kelas di Ruby, satu-satunya cara untuk memeriksanya adalah dengan melakukan apa yang Anda lakukan (membandingkan objek dengantrue
danfalse
atau kelas objek terhadapTrueClass
danFalseClass
). Tidak dapat memikirkan mengapa Anda membutuhkan fungsi ini, dapatkah Anda menjelaskan? :)Namun, jika Anda benar - benar membutuhkan fungsi ini, Anda dapat meretasnya di:
sumber
expect(some_method?(data)).to be_a(Boolean)
"quotes"
tetapi bukan angka dan booleanSeperti yang dinyatakan di atas tidak ada kelas boolean hanya TrueClass dan FalseClass namun Anda dapat menggunakan objek apa pun sebagai subjek jika / kecuali dan semuanya benar kecuali instance FalseClass dan nil
Pengujian Boolean mengembalikan instance FalseClass atau TrueClass
Monkeypatch to Object berikut akan memberi tahu Anda apakah sesuatu adalah instance TrueClass atau FalseClass
Menjalankan beberapa tes dengan irb memberikan hasil sebagai berikut
sumber
self == true or self == false
. Itu adalah satu-satunya contoh TrueClass dan FalseClass.boolean
, satu untuk TrueClass / FalseClass dan satu lagi untuk Object.Time#==
Ruby 1.8 menyebabkan perbandingan nilai non-Time menghasilkan nil, bukan false.Jika kode Anda dapat dengan bijaksana ditulis sebagai pernyataan kasus, ini cukup baik:
sumber
Objek yang berupa boolean akan memiliki kelas TrueClass atau FalseClass sehingga satu baris berikut harus melakukan triknya
Berikut ini juga akan memberi Anda hasil pemeriksaan tipe boolean benar / salah
sumber
Jadi cobalah
(x == true) ^ (x == false)
catatan ini, Anda memerlukan tanda kurung tetapi ini lebih indah dan ringkas.Itu bahkan melewati saran seperti "cuak" tetapi bukan "cuak" ...
class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)
Catatan : Perhatikan bahwa ini sangat mendasar sehingga Anda dapat menggunakannya dalam bahasa lain juga, yang tidak memberikan "thing is boolean".
Catatan 2 : Anda juga dapat menggunakan ini untuk mengatakan sesuatu adalah salah satu dari ??:
"red", "green", "blue"
jika Andaadd more XORS
... atau mengatakan hal ini adalah salah satu dari ??:4, 5, 8, 35
.sumber
Permata ini menambahkan kelas Boolean ke Ruby dengan metode yang berguna.
https://github.com/RISCfuture/boolean
Menggunakan:
Kemudian Anda
akan bekerja persis seperti yang Anda harapkan.
sumber
Tidak. Tidak seperti Anda memiliki kode Anda. Tidak ada kelas yang bernama Boolean. Sekarang dengan semua jawaban yang Anda miliki, Anda harus dapat membuat dan menggunakannya. Anda tahu cara membuat kelas bukan? Saya datang ke sini hanya karena saya sendiri yang bertanya-tanya tentang ide ini. Banyak orang mungkin berkata "Kenapa? Kamu harus tahu bagaimana Ruby menggunakan Boolean". Itulah mengapa Anda mendapatkan jawaban yang Anda lakukan. Jadi terima kasih atas pertanyaannya. Bahan untuk dipikirkan. Mengapa Ruby tidak memiliki kelas Boolean?
Perlu diingat bahwa Objek tidak memiliki tipe. Mereka adalah kelas. Objek memiliki data. Jadi itulah mengapa ketika Anda mengatakan tipe data itu sedikit keliru.
Coba juga rand 2 karena rand 1 sepertinya selalu memberikan 0. rand 2 akan memberikan 1 atau 0 klik berjalan beberapa kali di sini. https://repl.it/IOPx/7
Meskipun saya tidak tahu bagaimana cara membuat kelas Boolean sendiri. Saya telah bereksperimen dengan itu tapi ...
Setidaknya kita memiliki kelas itu sekarang tetapi siapa yang tahu bagaimana mendapatkan nilai yang benar?
sumber