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)