【发布时间】:2019-09-29 16:50:41
【问题描述】:
在对this question 用户的一个回答中,mu 太短了,解释说您不希望对象的行为在初始化时发生太大变化,这是有道理的,您应该能够通过阅读很好地推理对象它的定义和内省,但我想到了这个案例:
french_colors.yml
blue: blue
red: rouge
...
translations.rb
class Translations
def initialize(language: "french")
data = YAML.load_file("./translations/#{language}.yml")
data.each do |k, v|
define_method k do
v
end
end
print_french_colors
end
def print_french_colors
puts red
puts blue
end
end
初始化时,上面的错误与
#=> NoMethodError: undefined method `define_method' for #<C:0x2efae80>
在这里,您根据从翻译公司收到的文件构建所有翻译行为,并希望它作为一个实例,还希望它基于语言文件是动态的(这只是一个示例)
在初始化中将翻译定义和设置为对象的属性,而不是在初始化中使用 define_method 像这个问题 OP 和我试图做的那样,会更有意义吗?或者是不是专门为处理这种情况而编写了define_singleton_method 方法?
【问题讨论】:
标签: ruby oop metaprogramming