我想初始化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
没有,即使如此,它应该完全相反?
答案 0 :(得分:0)
这里有一些问题,所以我将其分成几个部分。
cattr_reader
cattr_reader
可能对你有用,但它是Rails的一部分,而不是Ruby。如果没有首先包含Rails的正确部分,您将无法在Ruby代码中使用它。
attr_reader
这里的主要问题是attr_reader
和cattr_reader
分别创建实例和类变量,但您使用的是局部变量。实例变量以@
开头,类变量以@@
开头。类变量有奇怪和混乱的行为,如上所述,cattr_reader
并没有内置到Ruby中,因此我建议在类级别使用attr_reader
。
include
在这里工作,而extend
没有,即使如此,它应该完全相反? extend
在类级方法中添加,而include
包含实例方法。您将method
定义为Mod1
的实例方法,因此您应该使用include
。