Khi gọi:
1 | receiver.some_method |
Ruby tìm method qua ancestor chain của class tương ứng. Hiểu chain này giúp giải thích inheritance, module mixin và những bug kiểu “method này từ đâu chui ra?”.
Instance method lookup
1 | module Trackable |
Ruby tìm từ trái sang phải trong ancestors và dừng ở method đầu tiên.
prepend
1 | module Logging |
prepend đặt module trước class, phù hợp để wrap behavior với super. Nó rõ hơn alias-method chain cổ điển và ít mang mùi khảo cổ.
extend
1 | module Findable |
extend include module vào singleton class của object. Với object Cat (bản thân class cũng là object), module methods trở thành class-level methods.
1 | Cat.singleton_class.ancestors |
Singleton method
1 | cat = Cat.new |
Method nằm trên singleton class của riêng cat, nên object khác không có.
super
super tiếp tục lookup sau vị trí method hiện tại trong chain. Nó không đơn giản là “gọi parent class”; module prepend/include cũng tham gia.
1 | def status |
Debug lookup
1 | cat.method(:status).owner |
Bốn dòng này thường hữu ích hơn việc nhìn code và đoán bằng trực giác. Metaprogramming không thần bí; nó chỉ có nhiều cửa, và Ruby khá lịch sự khi cho ta xem sơ đồ hành lang.