2009-03-10 30 views
5

Tôi có một lớp mà tôi muốn so sánh với cả chuỗi và ký hiệu trong trường hợp, vì vậy tôi nghĩ rằng tôi chỉ ghi đè phương thức ===() cho lớp của tôi và tất cả sẽ là vàng. Tuy nhiên phương thức ===() của tôi không bao giờ được gọi trong câu lệnh case. Ý tưởng nào?Làm thế nào để bạn ghi đè lên toán tử bình đẳng trường hợp ruby? (===)

Dưới đây là một số mã ví dụ, và những gì xảy ra trong một phiên 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 (chính): 010: 0> a = A.new ("hi")
=> #
IRB (chính): 011: 0> trường hợp
IRB (chính): 012: 1> khi "hi", sau đó 1
IRB (chính): 013: 1> khác 2
IRB (chính) : 014: 1> kết thúc
=> 2

(nó không bao giờ in thông điệp và phải luôn luôn trả về true anyway) Lưu ý rằng lý tưởng tôi muốn làm một

def ===(other) 
      #puts "in ===" 
      return @x.===(other) 
end 

Cảm ơn trước.

Trả lời

7

Biểu thức sau từ khóa 'trường hợp' là phía bên tay phải của biểu thức === và biểu thức sau từ khóa 'khi' ở phía bên trái của biểu thức. Vì vậy, phương thức đang được gọi là String. ===, không phải là A. ===.

Một cách tiếp cận nhanh chóng đảo ngược so sánh:

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 
+0

mát. Điều đó giải thích nó, và nó hoạt động! Cách này để làm các tuyên bố trường hợp có vẻ phản trực giác? – Marcin

+0

Tốt. Có, nó có vẻ hơi lộn xộn, nhưng tôi đã không đưa ra cú pháp nhiều suy nghĩ cho câu trả lời này. Bạn có thể có thể đưa ra một số cú pháp ngắn gọn hơn, hoặc bạn có thể làm điều gì đó xấu xa như ghi đè toán tử === trong các lớp bạn muốn có trên LHS. – janm

+0

Cảm ơn - Tôi có thể ngắn gọn hơn một chút nhưng nó cũng khiến tôi nghĩ rằng tôi có thể sử dụng công cụ sai (trường hợp) cho công việc, nhưng nó hoạt động, vì vậy cảm ơn bạn (tôi nên hỏi điều này ngày hôm qua). – Marcin

Các vấn đề liên quan