我有一个类似以下的模块
module MyModule
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def foo
@@var = 1
end
def bar
puts @@var
end
end
end
class A
include MyModule
foo
end
class B < A; end
这样
B.bar outputs '1'.
但是,如果调用.foo,我只想定义.bar。我试过了
module MyModule
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def foo
@@var = 1
extend SingletonMethods
end
module SingletonMethods
def bar
puts @@var
end
end
end
问题在于
B.bar
在MyModule :: SingletonMethods中返回错误“未初始化的类变量@@ var”。我怎样才能使.foo中定义的变量可用于.bar?
答案 0 :(得分:1)
使用mattr_accessor代替
答案 1 :(得分:0)
我能够使用自语法
从模块访问类变量class User
include Base
@@attributes = [:slug, :email, :crypted_password]
end
module Base
def self.included(base)
base.extend ClassMethods
end
def headers
if defined? self.attributes
self.attributes
end
end
end
现在调用User.headers
给我预期的结果
[:slug, :email, :crypted_password]
如果有人能够更清楚地了解为什么在红宝石中这样做的话,请告诉我!