루비에는 " 진실성 "과 " 거짓 "에 대한 보편적 인 아이디어가 있습니다.
루비 에는 부울 객체에 대한 두 개의 특정 클래스가 TrueClass
있으며 FalseClass
, 단일 인스턴스는 특수 변수 true
및 false
로 각각 표시됩니다 .
그러나 진실성 과 허위 는이 두 클래스의 인스턴스로 제한되지 않으며, 개념은 보편적 이며 Ruby의 모든 단일 객체에 적용됩니다. 모든 사물은 진실 하거나 거짓 입니다. 규칙은 매우 간단합니다. 특히, 두 개의 객체 만 거짓입니다 .
nil
의 싱글 인스턴스NilClass
및false
의 싱글 톤 인스턴스FalseClass
다른 모든 대상 은 진실 합니다. 여기에는 다른 프로그래밍 언어에서 허위 로 간주되는 객체도 포함 됩니다.
이 규칙은 언어에 내장되어 있으며 사용자가 정의 할 수 없습니다. to_bool
암시 적 변환이나 이와 유사한 것은 없습니다 .
다음은 ISO Ruby 언어 사양 에서 인용 한 것입니다 .
6.6 부울 값
객체는 하나에 분류된다 trueish 객체 또는 falseish 객체 .
false 와 nil 만 거짓 개체입니다. false 는 클래스의 유일한 인스턴스
FalseClass
(15.2.6 참조)이며 허위 표현식이 평가됩니다 (11.5.4.8.3 참조). 전무는 클래스의 전용 인스턴스NilClass
A (15.2.4 참조)되는 무 발현을 평가하여 (11.5.4.8.2 참조).false 및 nil 이외의 오브젝트 는 실제 오브젝트로 분류됩니다. true 는 클래스의 유일한 인스턴스
TrueClass
(15.2.5 참조)이며 실제 표현식은 평가됩니다 (11.5.4.8.3 참조).
실행 가능한 Ruby / Spec은 다음과 같은 것으로 보입니다 .
it "considers a non-nil and non-boolean object in expression result as true" do if mock('x') 123 else 456 end.should == 123 end
이 두 가지 출처에 따르면, 나는 Regexp
또한 진실 하다고 가정 하지만 내 테스트에 따르면 그들은 그렇지 않습니다.
if // then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are falsy'
나는 이것을 YARV 2.7.0-preview1 , TruffleRuby 19.2.0.1 및 JRuby 9.2.8.0에서 테스트했습니다 . 세 가지 구현 모두 서로 동의하고 ISO Ruby 언어 사양 및 Ruby / Spec에 대한 나의 해석에 동의하지 않습니다.
보다 정확하게 말하면 리터럴Regexp
을 평가 한 결과 개체 는 허위 인 반면 다른 표현의 결과 인 개체는 진실입니다 .Regexp
Regexp
r = //
if r then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are truthy'
이것은 버그입니까, 아니면 원하는 동작입니까?
!!//
거짓이지만 !!/r/
사실입니다. 참 이상합니다.
!!/r/
는 false
(RVM) Ruby 2.4.1을 사용하여 나를 위해 생성 합니다 .
//
in if // then
이 if //=~nil then
Regexp 인스턴스가 아니라 테스트 (바로 가기에 대한 바로 가기 ) 로 해석 된다고 생각 합니다.
Regex.new("a")
.