2

「Well Grounded Rubyist」という本を読んでいて、メソッド ルックアップ パスについて質問があります。

module M
  def report
    puts "'report' method in module M"
  end
end

module N
  def report
    puts "'report' method in module N"
  end
end

class C
  include M
  include N
  def report
    puts "'report' method in class C"
    puts "About to call super..."
    super
    puts "Back from super..."
  end
end

obj = C.new
obj.report

私の理解に基づいて、obj.report は次のように出力します。

'report' method in class C
About to call super...
'report' method in module N
Back from super...

ただし、クラス C 内から N のレポートをバイパスすることによって、M のレポート メソッドを呼び出すことができるかどうかは興味があります。モジュール N 内に「スーパー」を追加すると、N のレポートが呼び出され、次に M のレポートが呼び出されてから、"スーパーから戻る...」しかし、Cから直接これを行う方法はありますか?

4

2 に答える 2

3

祖先リフレクションを使用できます。

class C
  def report
    my_ancestors = self.class.ancestors
    puts "my ancestors are: #{my_ancestors}"
    method = my_ancestors[2].instance_method(:report)
    method.bind(self).call
  end
end

C.new.report
=> my ancestors are: [C, N, M, Object, PP::ObjectMixin, Kernel, BasicObject]
=> 'report' method in module M
于 2013-01-29T01:05:42.660 に答える
1

これは機能しますが、自分自身に変更せずにそれを行うためのより良い方法があるに違いないと感じています:

module M
   def self.report
      puts "'report' method in module M"
   end
end

Class C
include M
include N
def report
   puts "'report' method in class C"
   puts "About to call M.report..."
   M.report
   puts "About to call super..."
   super
    puts "Back from super..."
 end
 end

この出力は次のようになります。

'report' method in class C
About to call M.report...
'report' method in module M
About to call super...
'report' method in module N
Back from super...
于 2013-01-29T00:57:49.833 に答える