在一个答案中这个问题 https://stackoverflow.com/questions/19368437/how-to-use-define-method-inside-initialize用户, 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>
在这里,您根据从翻译公司收到的文件构建所有翻译行为,并希望将其作为实例,并且还希望它基于语言文件是动态的(这只是一个示例)
在初始化中将翻译定义和设置为对象的属性,而不是像OP和我试图做的那样在初始化中使用define_method,会更有意义吗?或者说这个方法是这样的define_singleton_method
是专门为了处理这样的情况而编写的吗?
如何在initialize()中使用define_method https://stackoverflow.com/questions/19368437/how-to-use-define-method-inside-initialize
目前尚不清楚您的最终目标是什么。例如,我不确定为什么你会有一个print_french_colors
如果语言不是法语,则使用此方法。看起来您基本上想读取 yaml 文件并使用它来设置一些预定义属性的值。
为了实现这一点,我认为使用instance_variable_set而不是define_method更有意义。这是一个例子。
法语.yml
blue: blue
red: rouge
require "yaml"
class Translations
attr_reader :blue, :red
def initialize(language: "french")
data = YAML.load_file("#{language}.yml")
data.each do |k, v|
if respond_to?(k)
instance_variable_set("@#{k}",v)
else
puts "#{k} is not defined"
end
end
print_french_colors
end
def print_french_colors
puts red
puts blue
end
end
t = Translations.new
t.print_french_colors
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)