【发布时间】:2010-07-16 10:18:52
【问题描述】:
运行此代码:
module A
def self.included(klass)
klass.send(:cattr_accessor, :my_name)
end
def set_my_name_var
@@my_name = 'A' # does NOT work as expected
end
def set_my_name_attr
self.class.my_name = 'A' # works as expected
end
end
class B
include A
cattr_accessor :my_other_name
def set_my_other_name_var
@@my_other_name = 'B' # works
end
def set_my_other_name_attr
self.class.my_other_name = 'B' # works
end
end
b = B.new
b.set_my_other_name_var
puts "My other name is " + B.my_other_name
b.set_my_name_var
puts "My name is " + B.my_name
b.set_my_other_name_attr
puts "My other name is " + B.my_other_name
b.set_my_name_attr
puts "My name is " + B.my_name
像这样中断:
My other name is B
TypeError: (eval):34:in `+': can't convert nil into String
如果我们交换最后两个代码块(这样b.set_my_name_attr 在b.set_my_name_var 之前被调用),一切正常。
看起来它将@@my_name 视为模块A 的类变量,而不是B 类(正如我所期望的那样)。不是很混乱吗?在哪里可以阅读更多关于模块类变量的信息?
【问题讨论】:
标签: ruby-on-rails ruby activesupport