문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top