Ruby Case Equality Operator를 어떻게 무시합니까? (===)
-
08-07-2019 - |
문제
Case 문에서 문자열과 기호와 비교하고 싶은 수업이 있으므로 수업의 === () 메소드를 무시하고 모두 금이 될 것이라고 생각했습니다. 그러나 내 === () 메소드는 사례 명령문에서 호출되지 않습니다. 어떤 아이디어?
다음은 몇 가지 예제 코드와 IRB 세션에서 발생하는 일입니다.
class A
def initialize(x)
@x=x #note this isn't even required for this example
end
def ===(other)
puts "in ==="
return true
end
end
irb (메인) : 010 : 0> a = a.new ( "Hi")
=> #
IRB (메인) : 011 : 0> 케이스 A
irb (메인) : 012 : 1> "Hi"시기 1 일 때 1
irb (메인) : 013 : 1> else 2
IRB (메인) : 014 : 1> 끝
=> 2
(메시지를 인쇄하지 않고 항상 사실을 반환해야합니다.) 이상적으로는 내가하고 싶다는 점에 유의하십시오.
def ===(other)
#puts "in ==="
return @x.===(other)
end
미리 감사드립니다.
해결책
'case'키워드 후의 표현식은 === 표현의 오른쪽이고, '시절'키워드 후 표현식은 표현식의 왼쪽에 있습니다. 따라서, 호출되는 방법은 String. ===, a. ===입니다.
비교를 뒤집기위한 빠른 접근법 :
class Revcomp
def initialize(obj)
@obj = obj
end
def ===(other)
other === @obj
end
def self.rev(obj)
Revcomp.new(obj)
end
end
class Test
def ===(other)
puts "here"
end
end
t = Test.new
case t
when Revcomp.rev("abc")
puts "there"
else
puts "somewhere"
end
제휴하지 않습니다 StackOverflow