2012-03-22 29 views
11

Tôi vừa mới đối mặt với hành vi này mà tôi thực sự không hiểu.Làm rõ phương pháp ghi đè lên trộn bằng Ruby

module M 
    def foo 
    "module_foo" 
    end 
end 

class C 
    def foo 
    "class_foo" 
    end 
    include M 
end 

puts C.new.foo 

Tại sao C.new.foo thực sự trả lại class_foo? Tôi đã khá nhiều chắc chắn rằng phương pháp nên được ghi đè bởi một trong mô-đun. Một điều khác, thay thế "class_foo" bằng super làm cho C.new.foo trả lại `" mô-đun_foo "

Điều đó thực sự giống như mô-đun được bao gồm bằng cách nào đó trước khi phương pháp thể hiện lớp được xác định. Ông có thể làm rõ?

Trả lời

14

Từ lập trình Ruby phần trên mixins:

Trong thực tế, hỗn hợp trong module hiệu quả xử như superclasses.

Vì vậy, những gì bạn trải nghiệm là bình thường. Mô-đun M của bạn là một lớp cha của lớp C của bạn

Vì vậy phương pháp foo bạn trong lớp C override phương thức foo trong mô-đun M

+0

heh, hiển nhiên. cảm ơn!! –

3

Sau đây là cách ruby ​​làm phương pháp tra cứu: lớp singleton

  1. người nhận;
  2. lớp người nhận;
  3. mọi phương thức mô-đun đi kèm;
  4. tra cứu lặp lại trong siêu lớp của người nhận;
  5. nếu không có phương pháp nào được tìm thấy, gọi hàm method_missing;

Bạn có thể tìm thêm chi tiết ở đây: http://ruby-metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.html

Vì vậy, để tìm ra một phương pháp, Ruby đi trong lớp của người nhận, và từ đó nó trèo chuỗi tổ tiên cho đến khi nó tìm thấy phương pháp này. Hành vi này còn được gọi là quy tắc "một bước sang phải, sau đó lên" : Chuyển một bước sang phải vào lớp người nhận và sau đó lên chuỗi tổ tiên, cho đến khi bạn tìm thấy phương pháp. Khi bạn bao gồm một mô-đun trong một lớp (hoặc thậm chí trong một mô-đun khác), Ruby tạo một lớp ẩn danh bao bọc mô-đun và chèn lớp ẩn danh vào chuỗi, ngay phía trên lớp bao gồm chính nó.

+1

method_missing không được kiểm tra cho đến khi sau khi đi bộ tất cả các tổ tiên – dbenhur

+0

Cảm ơn bạn đã chú ý rằng, chỉ cần sửa nó! – andersonvom

+1

0. Lớp đơn của người nhận; –

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