我试图通过鸭子输入来访问一个类变量,这里是代码的样子 -
Class Foo
self.league = League.New
在联盟课程中我有以下内容
@@some_array = ['A','B','C']
def self.some_array
@@some_array
end
但是当我使用我的鸭子类型来调用该值时,我得到一个未找到的"方法"错误
league.some_array
我发现如果我将该方法声明为实例方法,它将起作用 -
def some_array
@@some_array
end
但是我需要两次声明每个方法,而在我的应用程序的其他部分,我现在称之为League.Some_Array
,因为我只需要这些值,但我并没有真正对我做联盟。
这里的最佳做法是什么?
编辑:如果你打算回答这个问题,你能否至少告诉我为什么这是一个糟糕的问题?感谢。
答案 0 :(得分:1)
您可以定义类似attr_reader
的方法,该方法适用于类变量。
module ClassAttributes
def cattr_reader cattr
define_singleton_method(cattr) { class_variable_get("@@#{cattr}") }
define_method(cattr) { self.class.send(cattr) }
end
end
class Foo
extend ClassAttributes
@@bar = 10
cattr_reader :bar
end
Foo.bar # => 10
Foo.new.bar # => 10