Ruby nesnesinin Boolean olup olmadığı nasıl kontrol edilir


Yanıtlar:


136

Düşünebileceğim en basit yol:

# checking whether foo is a boolean
!!foo == foo

6
X sınıfı; def!; kendi kendine son; x = X.yeni; !! x == x # => doğru
Alexey

5
Evet, buna ördek yazma ve OOP'nin temel ilkesi denir. Bunun bir özellik olduğunu düşünüyorum.
Konstantin Haase

62
Kısa, mutlaka basit anlamına gelmez. Demek istediğim, wtf bu mu?
Grant Birchmeier

11
Foo'yu bir boolean'a çevirir, bunun foo ile aynı olup olmadığını kontrol eder.
Konstantin Haase

9
Çifte olumsuzlamanın bazı damalar ( RuboCop gibi ) tarafından kötü stil olarak kabul edildiğini unutmayın .
sschuberth

104

Bunu özlü ve kendi kendini belgeleyen buluyorum:

[true, false].include? foo

Rails veya ActiveSupport kullanıyorsanız, doğrudan bir sorgu bile yapabilirsiniz. in?

foo.in? [true, false]

Tüm olası değerlere karşı kontrol etmek, kayan değerler için tavsiye edeceğim bir şey değildir, ancak yalnızca iki olası değer olduğunda uygulanabilir!


1
Şimdiye kadarki en iyi cevap, yine de foo == true or foo == falsebirilerinin bir yorumda bulunmasını sevdim .
Ryan Taylor

3
Bunu sevdim çünkü kasıt olarak !!foo == foo.
stringsn88keys

Düpedüz pitonik! Kesinlikle burada açık ara en anlamsal cevap.
JM Janzen

85

BooleanRuby'de sınıf yoktur , kontrol etmenin tek yolu yaptığınız şeyi yapmaktır (nesneyi trueve falseveya nesnenin sınıfını TrueClassve ile karşılaştırmak FalseClass). Yine de bu işleve neden ihtiyaç duyacağınızı düşünemiyorum, açıklayabilir misiniz? :)

Eğer varsa gerçekten ancak bu işlevselliği gerek, bunu hackleyeceğimi edebilirsiniz:

module Boolean; end
class TrueClass; include Boolean; end
class FalseClass; include Boolean; end

true.is_a?(Boolean) #=> true
false.is_a?(Boolean) #=> true

1
mevcut değere göre tip yayın yapmaya çalışıyor.
Lance Pollard

75
Neden bunu yapasın ki? (ve türevleri) bir mühendisin başka bir soru sorabileceği en sinir bozucu sorulardan sadece biri :)
vemv

11
+1 çünkü bunu rspec'de şu şekilde kullanabilirim:expect(some_method?(data)).to be_a(Boolean)
Automatico

3
Türü kontrol etmeniz gereken diğer durum, veritabanı bağdaştırıcısını uyguladığınız ve "quotes"sayılar ve
boolelerle

23

Yukarıda belirtildiği gibi, yalnızca TrueClass ve FalseClass için boole sınıfı yoktur, ancak herhangi bir nesneyi if / when'nin konusu olarak kullanabilirsiniz ve FalseClass ve nil örnekleri dışında her şey doğrudur

Boole testleri, FalseClass veya TrueClass'ın bir örneğini döndürür

(1 > 0).class #TrueClass

Aşağıdaki monkeypatch to Object, bir şeyin TrueClass mı yoksa FalseClass mı olduğunu size söyleyecektir.

class Object
  def boolean?
    self.is_a?(TrueClass) || self.is_a?(FalseClass) 
  end
end

İrb ile bazı testler çalıştırmak aşağıdaki sonuçları verir

?> "String".boolean?
=> false
>> 1.boolean?
=> false
>> Time.now.boolean?
=> false
>> nil.boolean?
=> false
>> true.boolean?
=> true
>> false.boolean?
=> true
>> (1 ==1).boolean?
=> true
>> (1 ==2).boolean?
=> true

4
Yazması daha kolay self == true or self == false. Bunlar TrueClass ve FalseClass'ın tek örnekleridir.
Chuck

Time.now.boolean dışında aynı sonuçları döndüren @chuck? sıfır döndürür. Herhangi bir fikrin neden?
Steve Weet

Yöntemde self için bir sınıf kontrolü tanımlamak bir şekilde oop değildir. booleanTrueClass / FalseClass için ve Object için olmak üzere iki versiyonunu tanımlamalısınız .
Konstantin Haase

4
Bunun nedeni, Time#==Ruby 1.8 sürümündeki bir hatanın, Time olmayan değerlerle yapılan bir karşılaştırmanın false yerine nil döndürmesine neden olmasıdır.
Chuck

17

Kodunuz mantıklı bir şekilde bir vaka ifadesi olarak yazılabiliyorsa, bu oldukça uygundur:

case mybool
when TrueClass, FalseClass
  puts "It's a bool!"
else
  puts "It's something else!"
end

6

Boole olan bir nesne ya bir TrueClass ya da FalseClass sınıfına sahip olacaktır, bu nedenle aşağıdaki tek satırlık hile yapmalıdır

mybool = true
mybool.class == TrueClass || mybool.class == FalseClass
=> true

Aşağıdakiler de size doğru / yanlış boole türü kontrol sonucunu verir

mybool = true    
[TrueClass, FalseClass].include?(mybool.class)
=> true

4

Bu yüzden (x == true) ^ (x == false)paranteze ihtiyacınız olduğuna dikkat edin, ancak bu daha güzel ve derli toplu.

Hatta önerilen "cuak" gibi ama "cuak" değil ... class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)

Not : Bunun o kadar basit olduğuna bakın ki onu diğer dillerde de kullanabilirsiniz, bu bir "şey boole'dir" sağlamaz.

Not 2 : Bunu, şunlardan biri olduğunu söylemek için de kullanabilirsiniz ??:"red", "green", "blue"eğeradd more XORS... veya bu şeyin şunlardan biri olduğunu söyleyin ??:4, 5, 8, 35.


Neden XOR? Neden OR değil?
Nakilon


0

Hayır. Kodunuz olduğu gibi değil. Boolean adında herhangi bir sınıf yoktur. Şimdi sahip olduğunuz tüm cevaplarla bir tane oluşturup onu kullanabilmelisiniz. Nasıl sınıf yaratılacağını biliyorsun, değil mi? Buraya sadece bu fikri kendim merak ettiğim için geldim. Birçok kişi "Neden? Ruby'nin Boolean'ı nasıl kullandığını bilmeniz gerekir" diyebilir. Bu yüzden aldığın cevapları aldın. Soru için teşekkürler. Düşünce için yiyecek. Ruby neden bir Boole sınıfına sahip değil?

NameError: uninitialized constant Boolean

Nesnelerin türleri olmadığını unutmayın. Sınıflardır. Nesnelerin verileri vardır. Bu yüzden veri türleri dediğinizde bu biraz yanlış bir isimdir.

Rand 2'yi de deneyin çünkü rand 1 her zaman 0 verir gibi görünür. Rand 2 burada birkaç kez 1 veya 0 tıklama verecektir. https://repl.it/IOPx/7

Yine de Boolean sınıfını nasıl hazırlayacağımı bilmesem de. Denedim ama ...

class Boolean < TrueClass
  self
end

true.is_a?(Boolean) # => false
false.is_a?(Boolean) # => false

En azından şimdi o dersimiz var ama doğru değerleri nasıl elde edeceğimizi kim bilebilir?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.