1

我正在学习 Ruby,偶然发现了一些类似于下面的代码,它显示了实例变量和类实例变量之间的区别。我已经在我的控制台中对其进行了测试,它的工作方式与描述的一样(输出“John”)。我不明白的是如何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”
4

1 回答 1

2

这是关于范围

  define_method(:output_name) do
    puts name
  end

puts name部分具有实例范围

因此它可以访问实例方法,例如由

attr_reader :name
于 2020-04-28T16:56:47.203 回答