0

私は Ruby を初めて使用し、mixin と C# インターフェイスを比較するこの投稿を読んでいました。私には不明なのは、ミックスインのメソッドをそれを実装するクラスで再定義できるかどうかです。

たとえばinclude myMixin、メソッドを持っているクラスを配置した場合toJSON、クラスでMyClass再定義できますか?toJSONMyClassmyMixin

さらに興味のある人にとって、そのブログ投稿は良い情報源ですか? Ruby mixin を C# インターフェースと比較するのは合理的ですか?

4

3 に答える 3

2

クラスで定義されたメソッドは、Ruby のモジュールを介してそのクラスに混在するメソッドを常にオーバーライドします。

例えば:

module Bang
   def bar
      "lol"
   end
end

class Foo
   include Bang
   def bar
      42
   end
end

Foo.new.bar
 => 42 

モジュールがいつインクルードされるかに関係なくbar、クラスで定義されたメソッドが最初に呼び出されます。これは、Ruby がメソッドを検索する方法によるものです。クラスに含まれるモジュールを検索する前に、クラス自体を検索します。

http://anders.janmyr.com/2009/06/ruby-method-lookup.html

http://blog.rubybestpractices.com/posts/gregory/031-issue-2-method-lookup.html

于 2013-01-11T00:44:25.347 に答える
1

いいえ、行き詰まっていません。Mixin モジュールを追加するか、Mixin を含めた後にメソッドを再定義することで、メソッドをオーバーライドできます。

super継承と同様に、を呼び出すことにより、新しいメソッドで mixin に処理させるように決定できます。

C# のバックグラウンドを持っているので、Ruby について理解しておくべきことは、Ruby のメソッドは決して「スタック」しないということです。Object や Class などのコア言語クラスであっても、いつでもメソッドを再定義できます。これは危険ですが、可能です。プログラムで言語を変更したり、新しいクラスを作成したり、その他のメタプログラミング ブードゥーを実行したりできます。

于 2013-01-11T00:34:03.457 に答える
-1

includeモジュールを、ミックス先のクラスのスーパークラスにします。明らかに、サブクラスでスーパークラスのメソッドをオーバーライドできます。これは、Ruby だけでなく、ほとんどすべてのクラスベースの OO 言語でも同様にサブクラス化が機能する方法です。

于 2013-01-11T01:01:15.137 に答える