2

次のコードがあります。

class A
  def self.scope
    yield
  end
  def self.method_added method
    self.instance_eval %{
      # do something involving the added method 
    }
  end
end

class B < A
  scope do 
    def foo
    end
  end
end

method_addedフックが起動されると、内部のコードはinstance_eval追加されたメソッドと同じスコープ内で実行されますか? それとも、その外側で実行されますか?

これに関連する警告と落とし穴は何ですか?

4

2 に答える 2

1

確認してみましょう!

class A
  def self.scope
    yield
  end
  def self.method_added method
    puts "In method_added, method = #{method}, self = #{self}" 
    instance_eval 'puts "In instance_eval, method = #{method}, self = #{self}"'
  end
end

class B < A
  scope do
    puts "In scope's block, self = #{self}" 
    def foo
    end
  end
end

  # In scope's block, self = B
  # In method_added, method = foo, self = B
  # In instance_eval, method = foo, self = B

self.inは必要ないことに注意してくださいself.instance_eval

于 2015-01-29T19:16:43.367 に答える