Есть ли у Ruby define_method специальный доступ к переменным экземпляра?

Я изучаю Ruby и наткнулся на код, похожий на приведенный ниже, который показывает разницу между переменными экземпляра и переменными экземпляра класса. Я протестировал его в своей консоли, и он работает так, как описано (выводит «Джон»). Чего я не понимаю, так это того, как define_method получает доступ к переменной экземпляра @name без предшествующего name с @? Есть ли у него специальные возможности, которые позволяют ему это делать?

class User
  attr_reader :name

  def self.name
    "User"
  end

  def initialize(name)
    @name = name
  end

  define_method(:output_name) do
    puts name
  end
end

user1 = User.new("John")
user1.output_name #=> “John”

person wawa    schedule 28.04.2020    source источник
comment
attr_reader :name создает геттер для переменной экземпляра @name, например. def name; @name; end это метод, который вызывается в output_name и в данном случае не имеет ничего общего с define_method   -  person engineersmnky    schedule 28.04.2020


Ответы (1)


Это о размахе

  define_method(:output_name) do
    puts name
  end

Часть puts name имеет область действия.

Поэтому он имеет доступ к методам экземпляра, таким как созданный

attr_reader :name
person max pleaner    schedule 28.04.2020
comment
self.class.define_method будет определять метод экземпляра класса для Object, что означает, что почти объект теперь будет иметь этот метод. Однако define_singleton_method применил бы этот метод в области собственного класса, которую я думаю, это то, что вы искали - person engineersmnky; 29.04.2020
comment
@engineersmnky да, хорошо, ты прав. - person max pleaner; 29.04.2020
comment
Дело не в области действия, а в том, что ОП неправильно понимает разницу между name и @name. Они думают, что define_method каким-то образом может получить доступ к @name без @, что, конечно, совсем не то, что происходит. - person meagar; 30.04.2020