2

私は、洗練が Ruby の通常の継承スキームから外れているという印象を受けました。改良内のメソッドをオーバーライドすると、改良を使用するすべてのコードの元のメソッドが置き換えられます。

しかし、その後、この実験を で試してみsuperたところ、オーバーライドされたメソッドが呼び出されるようです。

class MyClass
  def my_instance_method
    puts "MyClass#my_instance_method"
  end
end

module MyRefinement
  refine(MyClass) do
    def my_instance_method
      puts "MyClass#my_instance_method in MyRefinement"
      super
    end
  end
end

using MyRefinement
MyClass.new.my_instance_method

上記のコードは次を出力します。

MyClass#my_instance_method in MyRefinement
MyClass#my_instance_method

私の質問は、どのようにですか?改良は何らかの方法でクラス階層に挿入されていますか?

4

1 に答える 1

2

ドキュメントに基づいて、改良の組み込み動作のメソッド検索は、観察したものと同じです。

呼び出すことで確認できる典型的な継承ではないというあなたの仮定は正しかったsuperclass

class C
  def foo
    puts "C#foo"
  end
end

module M
  refine C do
    def foo
      puts "C#foo in M"
      puts "class: #{self.class}"
      puts "superclass: #{self.class.superclass}"
      super
    end
  end
end

using M

x = C.new

x.foo

出力:

C#foo in M
class: C
superclass: Object
C#foo
于 2015-10-12T06:51:28.307 に答える