2010-06-12 134 views
99

似乎無法找到如何檢查對象是否容易布爾值。 Ruby中有這樣的事情嗎?檢查Ruby對象是否爲布爾型

true.is_a?(Boolean) 
false.is_a?(Boolean) 

現在我這樣做的,想縮短:

some_var = rand(1) == 1 ? true : false 
(some_var.is_a?(TrueClass) || some_var.is_a?(FalseClass)) 
+0

相似:[檢查是否變量是一個字符串在紅寶石?](http://stackoverflow.com/questions/7749416/check-whether-a-variable-is-a- string-in-ruby?rq = 1) – nawfal 2014-07-24 01:58:52

回答

113

我能想到的最簡單的方法:

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

class X; def!;自我結束; x = X.new; !! x == x#=> true – Alexey 2012-06-07 12:08:22

+5

是的,這就是所謂的鴨子打字和麪向對象的核心原則。我認爲這是一個功能。 – 2012-06-19 16:41:25

+1

問題在於「如果它像鴨子一樣走路」並不意味着「它像鴨子一樣嘎嘎」。相應地''pseudo_bool == pseudo_bool'並不意味着'pseudo_bool&true == pseudo_bool'例如。 – Alexey 2012-06-23 17:24:14

77

有Ruby中沒有Boolean類,檢查的唯一方法就是做你正在做什麼(將對象與truefalse或對象的類別對照TrueClassFalseClass進行比較)。想不到爲什麼你會需要這個功能,你能解釋一下嗎? :)

如果你真的然而需要這個功能,你可以破解它:

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

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

嘗試根據當前值進行類型轉換。 – 2010-06-12 10:45:23

+57

'你爲什麼會這麼做?' (和衍生產品)只是工程師可能做的另一個最令人討厭的問題之一:) – vemv 2014-03-27 14:20:33

+9

+1,因爲我可以在rspec中使用它,例如:expect(some_method?(data))to be_a(Boolean)' – Automatico 2014-10-14 15:56:07

19

如上所述沒有Boolean類只是TrueClass和FalseClass但是你可以使用任何對象作爲主題如果/除非一切都是真實的,除了FalseClass的實例和零

布爾測試返回FalseClass的實例或TrueClass

(1 > 0).class #TrueClass 

以下猴補丁到對象將告訴你什麼是TrueClass的實例或FalseClass

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

運行一些測試與IRB得出以下結果

?> "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

只需編寫'self == true或self == false'即可。這些是TrueClass和FalseClass的唯一實例。 – Chuck 2010-06-12 18:50:55

+0

@chuck返回除Time.now.boolean以外的相同結果嗎?返回nil。任何想法爲什麼? – 2010-06-12 22:24:46

+0

在方法中定義對自身的類檢查有點不符合要求。你應該定義兩個'boolean'版本,一個用於TrueClass/FalseClass,一個用於Object。 – 2010-06-13 19:41:46

5

一個布爾對象將有一個類的TrueClass或FalseClass,所以下面的一行應該做的誘騙

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

下也能給你真/假布爾型檢查結果

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

如果你的代碼能夠明智地寫成一個case語句,這是相當不錯的:

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

所以試試吧(x == true)^(x == false)注意你需要括號,但這更美觀和緊湊。

它甚至還通過了建議,如「cuak」,但不是「cuak」 ... class X; def !; self end end ; x = X.new; (x == true)^(x == false)

:看到這是如此基本,你可以在其他語言中使用過它,那不提供「東西是布爾」。

注2:您也可以使用此說的是??之一:"red", "green", "blue"如果你add more XORS ......或者說,這件事是??之一:4, 5, 8, 35

68

我覺得這是簡潔和自我記錄:

[true, false].include? foo 

如果使用Rails或的ActiveSupport,您可以使用in?

foo.in? [true, false] 

檢查,對所有可能的值ISN連做直接查詢我不推薦漂浮物,但只有兩種可能的價值時纔可行!

+0

最好的答案,雖然我也喜歡'foo == true或者foo == false',以便有人發表評論。 – 2016-06-10 20:53:56

+0

我喜歡這個,因爲它比'!! foo == foo'更有意思。 – stringsn88keys 2017-11-14 19:38:32

0

不。不像你有你的代碼。沒有任何名爲布爾的類。現在你有了所有的答案,你應該可以創建一個並使用它。你知道如何創建課程嗎?我只是來到這裏,因爲我自己只是在想這個想法。許多人可能會說「爲什麼?你必須知道Ruby如何使用布爾值」。這就是爲什麼你得到了你所做的答案。所以謝謝你的問題。食物的思想。爲什麼Ruby沒有布爾類?

NameError: uninitialized constant Boolean 

請記住,對象沒有類型。他們是班級。對象有數據。所以這就是爲什麼當你說數據類型時,這有點不恰當。

也嘗試蘭特2,因爲蘭特1似乎總是給0.蘭特2將給1或0 在這裏點擊運行幾次。 https://repl.it/IOPx/7

雖然我不知道如何去做一個布爾類自己。我已經嘗試過,但是...

class Boolean < TrueClass 
    self 
end 

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

至少我們現在有這個類,但誰知道如何獲得正確的值?