17

Tôi yêu ActiveSupport::Concern.Tại sao mô-đun InstanceMethods không được chấp nhận?

Giúp dễ dàng thêm chức năng vào lớp học của bạn, với cú pháp đẹp.

Dù sao, trong Rails 3.2, mô-đun InstanceMethods đã không được chấp nhận. Nếu tôi hiểu đúng, chúng ta chỉ cần xác định các phương pháp của chúng tôi trong included khối (trên thực tế nó chỉ là trong cơ thể của các mô-đun):

# edit: don't do this! The method definition should just be in the body of the module 
included do 
    def my_method; end 
end 

Tôi chỉ tự hỏi nếu có ai biết lý do tại sao họ đã quyết định làm điều đó?

Trả lời

26

Hãy xem ví dụ bạn đã liên kết trước.

module TagLib 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def find_by_tags() 
     # ... 
    end 
    end 

    module InstanceMethods 
    def tags() 
     # ... 
    end 
    end 
end 

Khi bạn đưa TagLib vào lớp học của bạn AS Quan tâm tự động mở rộng lớp học với mô-đun ClassMethods và bao gồm mô-đun InstanceMethods.

class Foo 
    include TagLib 
    # is roughly the same as 
    include TagLib::InstanceMethods 
    extend TagLib::ClassMethods 
end 

Nhưng như bạn có thể nhận thấy chúng tôi đã bao gồm chính mô-đun TagLib để các phương thức được xác định bên trong nó đã có sẵn làm phương pháp thể hiện trên lớp. Tại sao bạn muốn có một mô-đun InstanceMethods riêng biệt sau đó?

module TagLib 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def find_by_tags() 
     # ... 
    end 
    end 

    def tags() 
    # ... 
    end 
end 

class Foo 
    include TagLib 
    # does only `extend TagLib::ClassMethods` for you 
end 
+0

Ok, có ý nghĩa. Nhưng bây giờ tôi tự hỏi tại sao họ chọn lựa này ngay từ đầu ... Có sự khác biệt nào giữa cách họ đưa vào mô-đun InstanceMethods và các phương thức bình thường của mô-đun được bao gồm khi tôi chỉ làm 'bao gồm TagLib'? – Robin

+0

Nó chỉ là sự nhất quán? – Robin

+0

Tôi không chắc chắn, nhưng tôi nghĩ rằng nó chỉ mất một thời gian để nhận ra điều này. –

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