2017-01-03 5 views
4

私はRubyのコードでModule.prepend代わりのalias_method_chainを使用する方法を学んでいる、と私は何人かの人々が(example)を、それを呼び出すためにsendを使用することに気付きました:なぜ人々は `Module.send(:prepend、...)`を使うのですか?

ActionView::TemplateRenderer.send(:prepend, 
    ActionViewTemplateRendererWithCurrentTemplate) 

を他の人がそれを直接呼び出している間(example) :

ActionView::TemplateRenderer.prepend(ActionViewTemplateRendererWithCurrentTemplate) 

そして、私は誰もがこのスタイルを使用して見ていないが、私はあなたもあなたから先頭に追加しているモジュールでこれを書くことができますドキュメントから疑っ:

module ActionViewTemplateRendererWithCurrentTemplate 
    # Methods you're overriding go here 

    prepend_features ActionView::TemplateRenderer 
end 

これらの3つのスタイルにはいくつかの違いがありますか?他の人よりも好意的な理由はありますか?

+3

おそらく、#includeと#prependはRuby 2.1よりも前にプライベートメソッドだったので、人々は '古い習慣'のためにこのように書くでしょう。 – Matheno

+1

'prepend_features'は' prepend'によって呼び出され、一般的には*呼び出されないように意図されておらず、直接呼び出されるように設計されたフックメソッドです。 –

答えて

5

Module#prependは、added~ルビーバージョン2.0.0であった。

それは本来のユースケースは、次の形式であることと、プライベート方法として追加されました。多くの場合、人々はにモジュールを付加したいと

module Foo 
    # ... 
end 

class Bar 
    prepend Foo 

    # ... The rest of the class definition ... 
end 

しかし、それはすぐに明らかになりましたそのクラスの他の側面を定義しないクラス(コードのそのセクション)。そこで、以下のパターンが一般的になりました:Rubyのバージョン2.1.0

Bar.send(:prepend, Foo) 

、この問題はmaking Module#prepend a public methodによって対処された - ので、あなたは今、単にこれを書くことができます。ifことに注意してください、しかし

Bar.prepend(Foo) 

Ruby 2.0.0(2016年2月24日にofficial support endedにもかかわらず)をサポートするために必要なライブラリを作成している場合は、残念ながら古い.send(:prepend, ...)アプローチに固執する必要があります。

Module#include(当初からRuby言語になっています)は、<= 2.0.0のプライベートメソッドであり、2.1.0で公開されました。

関連する問題