2012-07-13 35 views
10

Giả sử đây là một số mã thư viện tùy ý mà tôi không biết về:Tôi có thể phát hiện ra rằng một phương pháp đã bị ghi đè không?

class Foo 
    def hi 
    end 
end 

class Bar < Foo 
    def hi 
    end 
end 

Và giả sử tôi có một số mã nơi tôi qua Bar như một tham số.

def check(x) 
    do_something_with(x.method(:hi)) 
end 

Trong ví dụ trên, tôi có thể biết rằng x.hi (nơi tài liệu tham khảo x một thể hiện của Bar) là khác nhau từ Foo#hi?


Dựa trên câu trả lời Gareth, đây là những gì tôi đã có cho đến nay:

def is_overridden?(method) 
    name = method.name.to_sym 
    return false if !method.owner.superclass.method_defined?(name) 
    method.owner != method.owner.superclass.instance_method(name).owner 
end 

Hideous? Tuyệt đẹp?

+0

Mặc dù không nhất thiết liên quan, tôi tò mò muốn biết tại sao bạn muốn làm điều này. –

+0

Ngoài ra, có vẻ như bạn chỉ quan tâm đến việc "ghi đè" đối với thừa kế như trái ngược với việc xác định lại phương thức hiện có trên cùng một lớp? –

Trả lời

9

Bạn có thể làm điều này:

if x.method(:hi).owner == Foo 

Tôi xa là một chuyên gia của Ruby; Tôi sẽ không ngạc nhiên nếu ai đó có cách nào tốt hơn thế này.

+0

Tuyệt vời! Chỉ cần tình cờ gặp phải điều tương tự. Và — giống như bạn — tôi sẽ chờ xem có người nào khác đến và bắn chúng tôi theo cách tiếp cận này không. Nếu không, tôi sẽ chấp nhận điều này vì tôi nghĩ tôi có thể sử dụng nó để đạt được những gì tôi đang theo đuổi. –

+0

@DanTao Nó có thể không quan trọng trong trường hợp của bạn, nhưng nếu 'Foo' là khỉ vá, nó sẽ vẫn báo cáo' Foo' là chủ sở hữu. –

+0

Tôi không thực sự thấy nó có thể làm gì khác trong trường hợp đó. (Và khỉ vá không phải là * ghi đè * anyway.) Tôi có thiếu gì đó không? –

0

Câu hỏi thú vị! Tôi tự hỏi về cùng một câu hỏi. Bạn có thể mở lại lớp Bar và kiểm tra xem ai là tổ tiên trong đường dẫn tra cứu của Bar có phương thức được định nghĩa.

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