在Class的文档中,它说:
class Name
# some code describing the class behavior
end
创建新类时,会初始化类型为Class的对象并将其分配给全局常量(在本例中为Name)。
调用Name.new创建新对象时,默认情况下会运行Class中的新方法。
还有这个图
+---------+ +-...
| | |
BasicObject-----|-->(BasicObject)-------|-...
^ | ^ |
| | | |
Object---------|----->(Object)---------|-...
^ | ^ |
| | | |
+-------+ | +--------+ |
| | | | | |
| Module-|---------|--->(Module)-|-...
| ^ | | ^ |
| | | | | |
| Class-|---------|---->(Class)-|-...
| ^ | | ^ |
| +---+ | +----+
| |
obj--->OtherClass---------->(OtherClass)-----------...
如果我创建了Name的实例:
class Name
attr_accessor :foo
# some code describing the class behavior
end
n = Name.new
对象n
如何以方法n.foo
结束?
起初我认为attr_accessor
是一种Object类型的方法,但是查看文档它实际上是模块的,我不会看到模块混合到Object的任何地方。
然后我认为,因为Class继承自Module并且调用Name.new
时,我认为new
是类型为Class的初始化对象的方法,它将创建Name的实例,并且在模块中调用attr_accessor
?但是attr_accessor
的文档说,
定义此模块的命名属性
这是否意味着同时创建了一个模块?那么它如何与我的Name实例相关?
答案 0 :(得分:0)
任何地方都无法附加任何内容。 attr_accessor
或多或少地被定义为:
class Module
def attr_accessor(*names)
names.each do |name|
define_method(name) do instance_variable_get(:"@#{name}" )
define_method(:"#{name}=") do |val| instance_variable_set(:"@#{name}", val)
end
end
end
这就是它的全部内容。