2013-02-04 2 views
3

두 개의 객체를 배타적으로 처리해야하는데 Ruby에 내장 된 배타적 논리합 연산자 (^)를 사용할 수 있다고 생각했지만 작동하지 않습니다. 정확히 내 객체 중 하나가 초기화되었는지 테스트하는 데 사용하고 싶었습니다.두 개의 객체를 배제하기

a = Object.new 
b = Object.new 
a^b # => NoMethodError: undefined method `^' for #<Object:0x007...> 

흥미롭게도, 나는 그것을 루비는 본질적으로 두 개체를 XOR하는 것을 허용하지 않는 이상한 생각

a = nil 
b = Object.new 
a^b # => true 

을 할 수 있습니다. 내가 누락 된 또 다른 명령이 있습니까? 아니면이 기능이 구축되지 않았습니까?

(a || b) && !(a && b) 

답변

4

어때?

a = Object.new 
b = Object.new 
c = nil 
!a^!b # => false 
!a^!C# => true 
+0

와우, 그렇게하는 것이 현명한 방법입니다. – AlexQueue

+0

@sawa 그러면 '! a &&! b' (또는'! (a || b)')가됩니다. –

0

흥미롭게도, 내가 NilClassnil^obj 방법을 가지고 있기 때문에입니다

a = nil 
b = Object.new 
a^b # => true 

을 수행 할 수 있습니다

은 분명히 내 문제에 대한 해결책은 다음을 수행하는 것입니다.

내가 누락되었거나이 기능이 아직 빌드되지 않았습니까?

빌드되지 않았습니다.

0

^ 개체의 연산자 (실제로는 메서드)를 재정의해야합니다. 뭔가 같이 :

class YourObject 
    def ^(rhs) 
    # You may want to do a check here that 
    # rhs is of the same type as your object, 
    # and throw an error if not 
    (self || rhs) && !(self && rhs) 
    end 
end 

난 당신이 아니라 객체를 변경하는 대신 자신의 클래스를 대체하는 것이 좋습니다.

+0

이 코드는 단축 될 수 있습니다. '(self || rhs) &&! (self && rhs)'는 이미 부울 값을 반환하기 만하면되지 않습니다. –

+0

@ MarkThomas 네, 당신 말이 맞습니다. 나는 보통 'if (true) return true'를 보았다. 감사. – iamnotmaynard

관련 문제