2008-10-02 31 views
9

Imagine Module của Ruby sau:Mục đích của các phương thức ví dụ trong Mô-đun không có lớp là gì?

module Foo 
    def inst_method 
    puts "Called Foo.inst_method" 
    end 
    def self.class_method 
    puts "Called Foo.class_method" 
    end 
end 

Rõ ràng Foo.class_method có thể được gọi mà không cần bất kỳ trường lớp. Tuy nhiên, điều gì đang xảy ra với Foo.inst_method? Có thể gọi Foo.inst_method mà không bao gồm/mở rộng một lớp học trước đó không?

Tuyên bố từ chối: Câu hỏi không tập trung vào giải quyết một vấn đề thực sự. Tôi chỉ cố gắng cải thiện sự hiểu biết của mình về hệ thống đối tượng Ruby.

Trả lời

12

Mục đích chính của các phương thức ví dụ trong các mô-đun là cung cấp chức năng đó cho các lớp bao gồm nó.

"Trộn trong" một mô-đun theo cách này thường được sử dụng làm phương pháp mô phỏng multiple inheritance hoặc trong các trường hợp khác mà thừa kế không phải là mô hình đúng (không hoàn toàn "là mối quan hệ") nhưng bạn muốn chia sẻ hành vi. Đó là một công cụ nữa để giữ mã của bạn DRY.

Một ví dụ tốt về điều này trong lõi Ruby ghi nhận như thế nào ArrayHash cả hai có thể được di chuyển và sắp xếp, vv Họ từng có được chức năng này từ Enumerable mô-đun (each_with_index, select, reject, sort và nhiều hơn nữa tất cả đều được quy định tại mô đun được bao gồm, không phải trong các lớp).

4

câu trả lời của tôi sẽ là: "không có bạn không thể gọi phương pháp mô-đun dụ mà không mở rộng hoặc trong đó có mô-đun trong một lớp học"

bây giờ biết ruby ​​và tất cả các thủ đoạn gian trá lập trình meta nó chứa có lẽ một cách để gọi nó nhưng nó sẽ là ngoài mục đích sử dụng các module

module Tester 
    def inst_meth 
    puts "test inst meth\n" 
    end 

    def self.meth 
    puts "test self meth\n" 
    end 
end 

begin 
    Tester.meth 
rescue; 
    puts $! 
end 
begin 
    Tester.inst_meth 
rescue 
    puts $! 
end 
begin 
    Tester.new.inst_meth 
rescue 
    puts $! 
end 
begin 
    extend Tester 
    inst_meth 
rescue 
    puts $! 
end 
begin 
    include Tester 
    inst_meth 
rescue 
    puts $! 
end 

cho

>ruby test.rb 
test self meth 
undefined method `inst_meth' for Tester:Module 
undefined method `new' for Tester:Module 
test inst meth 
test inst meth 
Các vấn đề liên quan