类级别中attr_reader的初始值

时间:2014-08-08 18:54:19

标签: ruby

我想初始化my_attr_reader。将attr_reader更改为cattr_reader无济于事,因为出于某种原因,cattr_reader有这样一种方法。

我该怎么做?

module Mod1
  def method1
    puts "method1 from Mod1"
  end
end

MyClass = Object.new
class << MyClass
  include Mod1

  attr_reader :my_attr_reader
  my_attr_reader = "111" # doesn't get initialized

  def initialize
    self.my_attr_reader = "123" # doesn't get initialized
  end

  def my_class1_method1
    puts "MyClass method1"
  end
end

MyClass.my_class1_method1
MyClass.method1
p MyClass.my_attr_reader # nil 

P.S。为什么include在这里工作,而extend没有,即使如此,它应该完全相反?

1 个答案:

答案 0 :(得分:0)

这里有一些问题,所以我将其分成几个部分。

关于cattr_reader

的说明

cattr_reader可能对你有用,但它是Rails的一部分,而不是Ruby。如果没有首先包含Rails的正确部分,您将无法在Ruby代码中使用它。

如何使用attr_reader

这里的主要问题是attr_readercattr_reader分别创建实例和类变量,但您使用的是局部变量。实例变量以@开头,类变量以@@开头。类变量有奇怪和混乱的行为,如上所述,cattr_reader并没有内置到Ruby中,因此我建议在类级别使用attr_reader

为什么include在这里工作,而extend没有,即使如此,它应该完全相反?

extend在类级方法中添加,而include包含实例方法。您将method定义为Mod1的实例方法,因此您应该使用include