我试图用类变量来理解模块包含。我认为包含带有类变量的模块也会将类变量包含在类定义中。
符合预期:
module A
@@my_name = "rick"
def print_name
puts @@my_name
end
end
class Y
include A
extend A
end
Y.print_name
但这不是:
module A
def self.included(klass)
klass.include B
klass.extend C
end
module B
@@my_name = "bob"
end
module C
def print_name
puts @@my_name
end
end
end
class Y
include A
end
Y.print_name
我期待“ bob ”,但我得到了:
A :: C
中未初始化的类变量@@ my_name
答案 0 :(得分:1)
如果您使用Module#class_variable_get
:
module C
def print_name
class_variable_get(:@@my_name)
end
end
Y.print_name
#=> "bob"
我认为问题在于module C
你说puts @@my_name
时它还不知道@@my_name
,因为在module C
你从来没有设定它(它已在module B
中设置,C
不知道B
)。
答案 1 :(得分:-1)
如果您尝试添加模块,该怎么办?这会为类添加一个模块,但是在类的方法之前插入它们。这是一种确保如果存在变量命名冲突的方法,模块将会胜出。
我的意思是这更像是一个评论,但我的用户评价还不够高,所以我很抱歉,如果这不符合标准。