Ruby 객체가 Boolean인지 확인하는 방법


122

객체가 부울인지 쉽게 확인할 수없는 것 같습니다. 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))

답변:


136

내가 생각할 수있는 가장 간단한 방법 :

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

6
클래스 X; def!; 자체 종료; x = X.new; !! x == x # => true
Alexey

5
예,이를 덕 타이핑이라고하며 OOP의 핵심 원칙입니다. 기능이라고 생각합니다.
콘스탄틴 하세

62
짧다고해서 반드시 단순한 것은 아닙니다. 내 말은, wtf는 무엇입니까?
Grant Birchmeier 2013

11
foo를 부울로 변환하고 foo와 동일한 지 확인합니다.
Konstantin Haase 2013

9
이중 부정은 일부 검사기 (예 : RuboCop )에서 잘못된 스타일로 간주됩니다 .
sschuberth

104

간결하고 자체 문서화되어 있습니다.

[true, false].include? foo

Rails 또는 ActiveSupport를 사용하는 경우 다음을 사용하여 직접 쿼리를 수행 할 수도 있습니다. in?

foo.in? [true, false]

가능한 모든 값을 확인하는 것은 수레에 대해 권장하는 것이 아니지만 가능한 값이 두 개뿐 일 때 가능합니다!


1
foo == true or foo == false누군가가 댓글을 달아주는 것도 좋았지 만 지금까지 가장 좋은 답변 입니다.
Ryan Taylor

3
나는 의도가 !!foo == foo.
stringsn88keys

정말 pythonic! 확실히 여기서 가장 의미론적인 대답입니다.
JM Janzen

85

더 없다 Boolean루비 클래스는, 확인하는 유일한 방법은 당신이하고 (대한 개체를 비교하는 일을하는 것입니다 true그리고 false나에 대한 객체의 클래스 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
현재 값을 기반으로 형변환을 시도합니다.
Lance Pollard

75
'왜 그런 짓을 했어?' (및 파생 상품)은 엔지니어가 다른 질문을 할 수있는 가장 성가신 질문 중 하나 일뿐입니다. :)
vemv

11
+1 왜냐하면 rspec에서 다음과 같이 사용할 수 있기 때문입니다.expect(some_method?(data)).to be_a(Boolean)
Automatico

3
당신이 데이터베이스 어댑터를 구현하고와 문자열 포장 필요로 할 때 필요 유형을 확인하기 위해 다른 경우가있다 "quotes"하지만 숫자와 부울
다니엘 Garmoshka을

23

위에서 언급했듯이 TrueClass 및 FalseClass 만 부울 클래스가 없지만 if / unless의 주제로 모든 객체를 사용할 수 있으며 FalseClass 및 nil의 인스턴스를 제외한 모든 것이 true입니다.

부울 테스트는 FalseClass 또는 TrueClass의 인스턴스를 반환합니다.

(1 > 0).class #TrueClass

Object에 대한 다음 monkeypatch는 무언가가 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 or self == false. 이들은 TrueClass 및 FalseClass의 유일한 인스턴스입니다.
Chuck

Time.now.boolean을 제외하고 동일한 결과를 반환하는 @chuck? nil을 반환합니다. 왜 그런지 아세요?
Steve Weet 2010-06-12

메서드에서 self에 대한 클래스 검사를 정의하는 것은 다소 엉망이 아닙니다. booleanTrueClass / FalseClass에 대해 하나와 Object에 대해 하나 의 두 가지 버전을 정의해야합니다 .
Konstantin Haase

4
그 이유는 Time#==Ruby 1.8 버전의 버그로 인해 시간이 아닌 값과의 비교가 false가 아닌 nil을 반환하기 때문입니다.
Chuck

17

코드가 case 문으로 현명하게 작성 될 수 있다면 이것은 꽤 괜찮습니다.

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

6

부울 인 객체는 TrueClass 또는 FalseClass 클래스를 가지므로 다음 한 줄이 트릭을 수행해야합니다.

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

다음은 또한 true / false 부울 유형 검사 결과를 제공합니다.

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

4

그래서이 아웃하려고 (x == true) ^ (x == false)하면 괄호가 필요하지만 더 아름답고 컴팩트 메모를.

제안 된 "cuak"은 통과하지만 "cuak"은 통과하지 못합니다. class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)

참고 : 이것은 너무 기본적인 것이므로 다른 언어에서도 사용할 수 있으며 "thing is boolean"을 제공하지 않습니다.

참고 2 : 또한 이것을 사용하여 일이 다음 중 하나입니까 ?? :"red", "green", "blue"만약 당신이add more XORS... 또는이 일이 다음 중 하나라고 말할수 있습니다4, 5, 8, 35.? :.


왜 XOR인가? OR이 아닌 이유는 무엇입니까?
킬론

2

이 gem은 유용한 메소드와 함께 부울 클래스를 Ruby에 추가합니다.

https://github.com/RISCfuture/boolean

사용하다:

require 'boolean'

그런 다음

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

예상대로 정확하게 작동합니다.


0

아니요. 코드가있는 것과는 다릅니다. Boolean이라는 클래스가 없습니다. 이제 모든 답을 가지고 하나를 만들고 사용할 수 있어야합니다. 수업을 만드는 방법을 알고 있지 않습니까? 이 아이디어가 궁금해서 여기에 온 것뿐입니다. 많은 사람들이 "왜? Ruby가 Boolean을 어떻게 사용하는지 알아야합니다."라고 말할 수 있습니다. 그래서 답을 얻었습니다. 질문 주셔서 감사합니다. 생각할 거리. Ruby에 Boolean 클래스가없는 이유는 무엇입니까?

NameError: uninitialized constant Boolean

객체에는 유형이 없습니다. 그들은 수업입니다. 개체에는 데이터가 있습니다. 그래서 데이터 유형을 말할 때 약간 잘못된 이름입니다.

또한 rand 1은 항상 0을 제공하는 것처럼 보이기 때문에 rand 2를 시도하십시오. rand 2는 여기에서 1 또는 0 클릭 실행을 몇 번 제공합니다. https://repl.it/IOPx/7

부울 클래스를 직접 만드는 방법을 모르지만. 실험 해 봤지만 ...

class Boolean < TrueClass
  self
end

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

적어도 우리는 지금 그 수업을 가지고 있지만 올바른 가치를 얻는 방법을 누가 압니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.