17

私はActiveSupport::Concernが大好きです。なぜInstanceMethodsモジュールは廃止されましたか?

クラスに機能を追加するのは簡単な構文です。

とにかく、Rails 3.2では、InstanceMethodsモジュールは廃止されました。

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

彼らはそれを行うことを決めた理由を誰もが知っている場合、私はちょうど思っていた:私が正しく理解している場合、 私たちは includedブロック (実際にはそれだけでモジュールの本体にあります)で、私たちのメソッドを定義する必要がありますか?

答えて

26

最初にリンクした例を見てみましょう。懸念は自動的にクラスメソッドモジュールとクラスを拡張し、InstanceMethodsモジュールを含むASあなたのクラスにTagLibのを含める

module TagLib 
    extend ActiveSupport::Concern 

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

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

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

しかし、あなたはその中で定義されたメソッドは、クラスのインスタンスメソッドとして既に利用されているので、我々はすでにのtaglibモジュール自体を含めている気づいた得るからです。なぜ、別のInstanceMethodsモジュールを持っていたいのですか?

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

いいです。しかし、今私はなぜ彼らが最初にこの選択をしたのだろうと思っています...彼らがInstanceMethodsモジュールを含む方法と、 'include TagLib'を行うときにモジュールの通常のインスタンスメソッドがどのように含まれるかに違いはありませんか? – Robin

+0

一貫性のためだけでしたか? – Robin

+0

わかりませんが、これを実現するにはちょっと時間がかかったと思います。 –

関連する問題