ruby の初心者として、gem 同士が競合することはあるのだろうかと考えていました。たとえば、2 つの gem が配列の << メソッドをオーバーライドした場合、どちらが勝つでしょうか、それともこれを止めるものはありますか?
ありがとう
ruby の初心者として、gem 同士が競合することはあるのだろうかと考えていました。たとえば、2 つの gem が配列の << メソッドをオーバーライドした場合、どちらが勝つでしょうか、それともこれを止めるものはありますか?
ありがとう
メソッドをオーバーライドするのではなく、メソッドを再定義することについて話していると思いますよね?2 つのライブラリが 2 つの異なるサブクラスで同じメソッドをオーバーライドしたとしても、問題はありません。
2 つ以上のライブラリが同じメソッドを再定義する場合、たまたま最後にロードされたライブラリが優先されます。実際、これはただ1 つのライブラリがメソッドを再定義するのと何ら変わりはありません。Ruby インタープリターが の実装を提供し、Array#<<
それを再定義する場合は、単純に後から来たという理由だけで、あなたの定義が優先されます。
これを止める最善の方法は簡単です。既存のメソッドを台無しにしないでください。また、そうするライブラリを使用しないでください。-w
少なくともRuby 1.9.2では、メソッドが再定義された場合に警告を出力するため、警告を有効にするコマンドラインフラグは非常に役立ちます。
Ruby 2.0 では、メソッドの (再) 定義をある種の名前空間に分離するメカニズムがおそらくあるでしょう。しかし、息をのむことはできません: これらのいわゆるセレクター名前空間は、Ruby コミュニティでほぼ 10 年前から話題になっており、Smalltalk コミュニティではそれよりも長く話題になっています。 Rubyの実用的なデザインでさえ。新しいアイデアはClassboxesのアイデアです。
私が知る限り、あなたはモンキーパッチ (Ruby コミュニティではダックパンチとしても知られています) について話しているようです。
この記事には、モンキーパッチ (およびその他のプラクティス) がうまくいかなかった別の例があります。
実際にはそうではありませんが、実際に試してみれば、おそらくそのような状況を構築できるでしょう。これがどのように発生するかを説明する興味深い記事(古いものですが) があります。
2 つの gem が「配列の << メソッドをオーバーライドする」場合、それらは Array をサブクラス化する必要があり、それらのクラスは異なる名前を持つか、異なるモジュールに含まれます。