我在模块内动态定义类方法方面遇到了麻烦。请看以下代码。我在模块中引用另一个类方法时,出现了NameError: undefined local variable or method
错误。似乎这可能是作用域或上下文问题,但我尚未能够解决它。
module Bar
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def fruits
["apple", "orange", "banana"]
end
def example_function(string)
string.upcase
end
fruits.each do |fruit|
method_name = fruit.to_sym
define_method(method_name) { example_function(fruit) }
end
end
end
class Foo
include Bar
end
puts Foo.apple
puts Foo.orange
puts Foo.banana
我希望能够调用以下内容:
puts Foo.apple => "APPLE"
puts Foo.orange => "ORANGE"
puts Foo.banana => "BANANA"
目前,当我尝试使用以下任何一种方法时,会出现以下错误:
NameError: undefined local variable or method 'fruits' for Bar::ClassMethods:Module
此外,Bar::ClassMethods中的类方法应该对Foo可用,因此我应该能够调用:
puts Foo.fruits => ["apple", "orange", "banana"]
要求:
- 所有代码都在一个单一的模块内。
- 该模块允许混合实例方法和类方法(请参考下面的文章)。
- 目标方法是动态定义的。
请阅读“Ruby中的Include vs Extend”(尤其是标题为“A Common Idiom”的部分)。http://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/
非常感谢您的帮助!