如何在Ruby中使用Module类的attr_reader方法?

How can I use methods attr-reader of the Module calss in Ruby?

本问题已经有最佳答案,请猛点这里访问。

我已经看到了在Ruby程序中使用的attr_reader、attr writer和attr_访问器,就好像它们是对象方法(或混合到objest中的内核方法)。然而,attr-reader、attr-writer和attr-accessor是名为module的类的一部分,我不理解它们如何在所有类中使用,是什么使它们可用?

谢谢,鲁文


工作原理如下:

1
2
3
4
5
6
7
8
9
10
module Attr
  attr_accessor :my_variable
end

class MyClass
  @my_variable ="hi"
  def initialize
    @my_variable ="ho"
  end
end

您在类中使用include模块来构造实例变量@my_variable的访问器:

1
2
3
4
5
MyClass.include Attr
c = MyClass.new
c.my_variable                #=>"ho"
c.my_variable ="huh?"       #=>"huh?"
c.my_variable                #=>"huh?"

您可以使用extend模块来构造类实例变量@my_variable的访问器:

1
2
3
4
5
MyClass.extend Attr          #=> MyClass
MyClass.my_variable          #=>"hi"
MyClass.my_variable ="nuts" #=>"nuts"
MyClass.my_variable          #=>"nuts"
c.my_variable                #=>"huh?"

如您所见,实例变量@my_variable与类实例变量@my_variable不同。它们共存,就像它们有不同的名字一样。

更常见的是,您会在类定义中看到includeextend,但效果与我上面所看到的相同:

1
2
3
4
5
6
7
8
class MyClass
  include Attr
  extend Attr
  @my_variable ="hi"
  def initialize
    @my_variable ="ho"
  end
end