2

Saladメソッドを持つクラスがあり、chewその中で使用する場合、祖先のチェーンを上ってsuper次に利用可能なメソッドが呼び出されます。chew「2 つ上のレベルに到達」したい場合はどうすればよいですか (chewチェーンを上っていく 2 番目に利用可能な方法まで)。super最初の祖先のメソッドに追加せずにそれを行う方法はありますか?

これをもう少し具体的にするために、これがオブジェクトを持つ私のSaladクラスだとしsaladます。

class Salad < Food
  include Almonds
  include Gorgonzola
  include Spinach
  include Dressing

  def chew
    super
  end
end

salad = Salad.new

祖先の配列は次のようになります。

[Salad, Dressing, Spinach, Gorgonzola, Almonds, Food, Object, Kernel, BasicObject]

Dressing#chew に追加せずにメソッドsalad.chewをトリガーしたい場合、それは可能ですか? 2 レベル上に到達する方法はありますか ( 1 レベル上に「到達」するのと同じ方法で )?chewSpinachsupersuper

4

3 に答える 3

5

はい、あなたが説明していることを行う方法が#methodあります. このメカニズムは、便利なキーワード を使用するほどきれいではありませんが、 の機能のスーパーセットを提供します。もう少し詳細がありますが、信じてください。この方法で、やりたいことは何でもできます。それが Ruby の力です。Lispiest の魔法で, and (これまでのところ未完成)が必要になるまでは、何でもできます。#instance_methodmethod = Spinach.instance_method( :chew )method.bind( Salad )supersuperRipperSorcerer

(使用例については、 Hash から派生したクラスで Object.inspect / Object.to_s を使用するでの私の他の回答を参照してください)

于 2013-05-19T03:14:49.057 に答える
1

chewすべてのモジュールでメソッドを呼び出す方法を知りたい場合は、構成を使用するより良い解決策があります。モジュールは動作のためのものであり、Salad クラスについて考える場合、ほうれん草やアーモンドのように動作させたくない場合は、それらで構成する必要があります。したがってchew、サラダを作るときchewは、その各コンポーネントを使用します。

于 2013-05-19T00:46:23.193 に答える
1

いいえ、あなたが説明していることを行う方法はありません(そして正当な理由があります)。あなたが説明する「スーパースーパー」キーワードを使用すると、継承チェーンの詳細(およびそのチェーン内のどのクラス/モジュールが特定のメソッドを実装するか)と密接に結び付きすぎます。それは非常にもろくなるでしょう。そのようなキーワードが存在し、それを使用した場合、メソッド定義の移動などの小さな変更により、非常に簡単に問題が発生します。また、コードの読者にとっても非常に混乱するでしょう。

キーワードの目的はsuper、クラスを取得し、それをサブクラス化し、メソッドをオーバーライドし、そのメソッドにいくつかの新しい動作を追加しながら、メソッドが最初に行ったすべてのことを実行できるようにすることです。事実上、 「このメソッドのデフォルトsuperの動作を実行するようになりました」と言います。これは、その「デフォルト」の動作がスーパークラス、スーパースーパークラス、モジュール、またはその他の場所で定義されているかどうかに関係なく機能します。

于 2013-05-18T23:53:07.063 に答える