Ruby 单例对象上的attr_访问器未按预期工作

Ruby 单例对象上的attr_访问器未按预期工作,ruby,Ruby,鉴于以下两种不同的实现方式,为什么Cat.new.name可以工作,而Dog.new.name不能工作: class Cat end Cat.instance_eval do attr_accessor :name end 但这不起作用: class Dog class << self attr_accessor :name end end 关于,我将通过instance\u eval块与以下内容进行讨论: 我们处于Cat(Cat是self)的上下文中,

鉴于以下两种不同的实现方式,为什么
Cat.new.name
可以工作,而
Dog.new.name
不能工作:

class Cat
end 

Cat.instance_eval do
  attr_accessor :name
end
但这不起作用:

class Dog
  class << self
    attr_accessor :name
  end
end
关于,我将通过
instance\u eval
块与以下内容进行讨论:

  • 我们处于
    Cat
    Cat
    self
    )的上下文中,因此本质上,我们调用
    Cat.attr\u accessor:name
    ,这是一个宏,表示“嘿,对于从
    Cat
    创建的所有实例,给它们方法
    name
    name=/code>”
我试图将这一理解扩展到以下方面,但这是错误的:

class Dog
  class << self
    attr_accessor :name
  end
end

d = Dog.new
d.name = "dog name" # => undefined method `name=' for #<Dog:0x007ff6c3062c20> (NoMethodError)
类狗
为#(NoMethodError)类未定义的方法'name='

说到这里,我想说
class您的问题是什么?
Dog.name
的典型用法非常有效,因为您在类级别声明了访问器。
Dog.new.name
显然不起作用,因为
Dog
的实例没有被授予访问器。”把我放在Dog的singleton对象的上下文中”-这是你错的地方。它把你放在Dog的singleton类的上下文中。在这个类中只有一个实例,
Dog
。attr\u访问器将getter/setter授予这个实例。
class Dog
  class << self
    attr_accessor :name
  end
end

d = Dog.new
d.name = "dog name" # => undefined method `name=' for #<Dog:0x007ff6c3062c20> (NoMethodError)