在创建类的实例时,如何附加attr_accessor方法?

时间:2016-12-12 22:05:47

标签: ruby

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实例相关?

1 个答案:

答案 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

这就是它的全部内容。