2010-06-21 2 views
11

에서 나는 다음과 같은 코드를 이해하지 않는 경우 (X!) :경우 대 (X == false)를 루비

ruby-1.9.1-p378 > puts "nil is false" unless nil 
nil is false 
=> nil 
ruby-1.9.1-p378 > puts "nil isn't false" unless nil == false 
nil isn't false 
=> nil 

대부분의 언어의 (a C-기지를, 적어도), 경우 (! cond)와 if (cond == false)가 동일한 것을 평가합니다. 그렇게하지 않기 위해 여기에서 무슨 일이 일어나고있는거야?

는 (나는 그게 얼마나 것을 이해, 왜의 세부 사항을 싶습니다.)

답변

31

루비는 falsenil이 유일한 "거짓"값인 반면 다른 모든 것은 "진실"이라고 생각합니다. 이것은 정의에 의한 것이며 수정할 수 없습니다 (적어도 MRI에서는). 이 정의는 if, unless, while, until, cond ? if_truthy : if_falsey, ||, &&, ...

foo == bar 항상 인수로 barfoo== 메소드를 호출 쓰기와 같은 모든 내장 연산자를 사용합니다. 기본적으로 nil, false, true 및 기호와 같은 기타 모든 즉시 항목은 자신과 동일합니다. 하지만 이것은 변경 될 수 있습니다 :

def nil.==(bar) 
    super || bar == false 
end 
puts "nil == false" if nil == false # => "nil == false" 

루비 1.9에서, 당신은 또한 운영자 !을 다시 정의 할 수 있습니다, 그래서 unless foo 반드시 if !foo 동일하거나 if foo의 반하지 :

def true.! 
    true 
end 

puts "True?" if true # => "True?" 
puts "or not?" if !true # => "or not?" 

하지 않는 것이 아무도 이런 식으로하는 것이 좋습니다 ...

+0

* 실제로 거짓 *, 그냥 * 거짓 *. 완벽한 설명. +1. 그리고 예, 제발 무시하지 마십시오 == 또는! 또는 당신이 아주 아주 좋은 이유가 없다면 뭐든간에. – MatrixFrog

+0

+1 좋은 답변입니다. PHP에서도'==='연산자를 구현해야만합니다 (예 : * 3 * '=') – Mawg

+0

설명에 감사드립니다. –

2

nil== 이상 비교하여 거짓 같지 않은 그 의미 내용이 다르기 때문에 (nil가 아무런 정보도 없습니다, false는 부울 값입니다.) 그러나 부울 컨텍스트에서 nil을 평가하려고 시도하면 편의상 다른 언어와 관용적 인 호환성 때문에 False로 간주됩니다.

nil == a <=> nil != a <=> false은 사실상 nil을 제외한 모든 값에 해당합니다.

그래서 'nil is not true'와 'nil is nil'만 말할 수 있습니다. 이것은 루비가 그 길을가는 한입니다.

0

일부 언어에서는 "if"문에서만 불린을 사용할 수 있습니다. 문자열이나 숫자가 참인지 거짓인지를 확인하려고하면 어리석은 의미가 없으므로 언어로 처리 할 수 ​​없습니다.

그러나 Ruby에서는 실제로는 아니지만 모든 것이 부울로 간주 될 수 있습니다. 실제로 Ruby의 모든 내용은 유효하지 않습니다 (nil 및 false (IIRC) 제외). 그것은 정수 45가 실제로는 참이라는 것을 의미하지는 않는 것처럼 nil이 실제로는 FALSE 일 것을 의미하지는 않습니다. 그들은 서로 다른, 분리 된 것입니다. 그러나 nil을 부울처럼 취급하려는 경우 (if 또는 unless에서 사용) 즉, false 인 것처럼 처리합니다.

관련 문제