2010-03-01 24 views

Trả lời

52

module_function đặt các phương thức cá thể đã cho riêng tư, sau đó sao y và đặt chúng vào metaclass của mô-đun làm phương thức công khai. extend self thêm tất cả các phương thức thể hiện vào singleton của mô-đun, khiến chúng không bị thay đổi.

module M 
    extend self 

    def a; end 

    private 
    def b; end 
end 

module N 
    def c; end 

    private 
    def d; end 

    module_function :c, :d 
end 

class O 
    include M 
    include N 
end 

M.a 
M.b # NoMethodError: private method `b' called for M:Module 
N.c 
N.d 
O.new.a 
O.new.b # NoMethodError: private method `b' called for O 
O.new.c # NoMethodError: private method `c' called for O 
O.new.d # NoMethodError: private method `d' called for O 
+3

vâng phương pháp lớp module_function là công khai nhưng phương pháp dụ là tin – horseyguy

+1

module_function "tạo ra các chức năng mô-đun cho các phương pháp đặt tên. Các chức năng này có thể được gọi với các module như một máy thu, và cũng có thể trở thành có sẵn như là phương pháp dụ đến các lớp học mà kết hợp trong mô-đun. Chức năng của mô-đun là bản sao của bản gốc, và do đó có thể được thay đổi độc lập. Các phiên bản phương pháp cá thể được tạo riêng. Nếu được sử dụng không có đối số, thì các phương thức được xác định sau sẽ trở thành các hàm mô-đun. " nguồn: http://www.ruby-doc.org/docs/ProgrammingRuby/html/ref_c_module.html#Module.module_function – mysmallidea

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