2009-06-10 20 views
11

Tôi đang xem mô-đun X chứa hai mô-đun được gọi là "InstanceMethods" và "ClassMethods"."base.send: include, InstanceMethods" ---> Điều này làm gì?

Định nghĩa cuối cùng trong mô-đun X là thế này:

def self.included(base) 
    base.send :include, InstanceMethods 
    base.send :extend, ClassMethods 
    end 

Điều này làm gì?

+1

Tôi biết nó không phải là mã của bạn, nhưng lưu ý rằng không cần phải có một mô-đun InstanceMethod: module cha mẹ đã được bao gồm, vì vậy chúng ta nên đặt những phương pháp dụ đó. – tokland

Trả lời

8

included được gọi bất cứ khi nào một module được hạch toán vào khác mô-đun hoặc lớp học. Trong trường hợp này nó sẽ cố gắng để gọi base 'include phương pháp s để có được phương pháp mô-đun, các biến và hằng số từ InstanceMethods thêm vào base và sau đó sẽ cố gắng để gọi base' s extend phương pháp để có được những phương pháp dụ từ ClassMethods thêm vào base.

Nó cũng có thể là

def self.included(base) 
    base.include(InstanceMethods) 
    base.extend(ClassMethods) 
end 
+1

Ok, điều đó có ý nghĩa. Có một lớp W bao gồm mô đun X, vì vậy ý ​​tưởng là W nhận tất cả các phương thức cá thể và các phương thức lớp chứa trong X thông qua các mô-đun này. Các mảnh còn thiếu là làm thế nào 'bao gồm' được gọi là - nhưng bạn đang nói ngay khi tôi nói "W bao gồm X", bao gồm() phương pháp sẽ được gọi. - franz 0 giây trước – franz

+2

Đúng vậy. Có một số thông tin khác và ví dụ thân thiện tại http://ruby-doc.org/core/classes/Module.html#M001683 – toholio

+9

bao gồm là phương pháp riêng tư của lớp Phương thức. do đó, base.include sẽ không hoạt động. –

0

Định nghĩa phương thức lớp có tham số "base". Sau đó, nó gọi các phương thức includeextend trên base, chuyển mô-đun InstanceMethodsClassMethods làm đối số, tương ứng. Cuộc gọi đến include sẽ thêm các phương thức thể hiện được xác định trong InstanceMethods đến base. Tôi không quen thuộc với phương thức extend, nhưng tôi cho rằng nó cũng sẽ làm điều tương tự, nhưng đối với các phương thức lớp.

1

'send' gọi đối số đầu tiên của nó làm phương thức trên đối tượng được gọi và phần còn lại của đối số được gửi làm đối số cho phương thức. Vì vậy, trong trường hợp này,

base.send :include, InstanceMethods 

tương đương với

base.include(InstanceMethods) 

nào cho biết thêm các phương pháp trong module InstanceMethods vào 'cơ sở' đối tượng

+2

Không hoàn toàn tương đương, vì 'base.send: include' sẽ vẫn gọi bao gồm ngay cả khi phương thức đã được đặt ở chế độ riêng tư. 'base.include' sẽ gây ra lỗi. –

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