Где находится метод хранения Ruby, определенный в instance_eval () - PullRequest
1 голос
/ 24 февраля 2012

Вот пример:

class MyClass
end

obj = MyClass.new
obj.instance_eval do
  def hello
    "hello"
  end
end

obj.hello
# => "hello"

obj.methods.grep "hello"
# => ["hello"]

MyClass.instance_methods.grep "hello"
# => []

Методы экземпляра MyClass не содержат метод 'hello', поэтому мой вопрос: где Ruby хранит метод, определенный в instance_eval ()?

1 Ответ

2 голосов
/ 24 февраля 2012

Посмотрите на это:

obj = MyClass.new
def obj.hello
  "hello"
end

obj.hello #=> "hello"
obj.singleton_methods #=> [:hello]
obj.methods.grep :hello #=> [:hello]

obj.instance_eval do
  def hello2 ; end
end #

obj.singleton_methods #=> [:hello, :hello2]

Как вы можете видеть вместо использования instance_eval, вы также можете определить метод непосредственно на объекте.В обоих случаях они попадают в синглтон-класс объекта (собственный класс), к которому можно обратиться через obj.singleton_class в Ruby 1.9 и идиому class << self ; self; end в Ruby 1.8.

...