Ruby类:使用yaml处理任何未实现的方法
我想创建一个特殊的设置类Ruby类:使用yaml处理任何未实现的方法,ruby,yaml,notimplementedexception,Ruby,Yaml,Notimplementedexception,我想创建一个特殊的设置类settings。当用户键入类似于Settings.new.method\u 1.method\u 2.method\u 3的内容时,该类应该能够处理这种情况,并将其转换为类似以下内容: result = nil if ConfigurationSettings['method_1'].present? result = ConfigurationSettings['method_1'] if result['method_2'].present? res
settings
。当用户键入类似于Settings.new.method\u 1.method\u 2.method\u 3的内容时,该类应该能够处理这种情况,并将其转换为类似以下内容:
result = nil
if ConfigurationSettings['method_1'].present?
result = ConfigurationSettings['method_1']
if result['method_2'].present?
result = result['method_2']
...
end
return result
当然,稍后我会让它更灵活,这样它就可以有2/3个以上的方法了。我想这就是您面临的问题:
class Settings
def abc
puts "abc"
end
def xyz
puts "xyz"
end
end
s = Settings.new
s.abc
#abc
# => nil
s.xyz
#xyz
# => nil
s.abc.xyz
#abc
#NoMethodError: undefined method `xyz' for nil:NilClass
这里的问题是s.abc
返回nil
,xyz
调用nil
。你想要达到的目标被称为。现在,xyz
需要一个Settings
对象。这里要做的最简单的事情是:
class Settings2
def abc
puts "abc"
self
end
def xyz
puts "xyz"
self
end
end
s2 = Settings2.new
s2.abc.xyz
#abc
#xyz
方法\u missing
可供您使用,可用于帮助您解决此问题。将此与方法链接相结合,您就可以开始了。例如:
class Settings
def method_missing(meth)
puts "Missing #{meth}"
self
end
def test
puts "Test"
self
end
end
a = Settings.new
a.test
a.test.b
a.b.test
其他答案的问题是所有方法都返回“self”,因此如果要访问嵌套值
final_value = Settings.new.method_1.method_2.method_3
你只需要得到整个设置散列
试试这个
class Settings
class SubSettings
def initialize(sub_setting)
@sub_setting = sub_setting
end
def method_missing(method, *arguments, &block)
if @sub_setting[method].is_a?(Hash)
SubSettings.new @sub_setting[method]
else
@sub_setting[method]
end
end
def answer
@sub_setting
end
end
def initialize
@settings = ConfigurationSettings
end
def method_missing(method, *arguments, &block)
SubSettings.new @settings[method]
end
end
ConfigurationSettings = {level1a: {level2a: {level3a: "hello", level3b: "goodbye"}, level2b: {level3b: "howdy"}}}
result = Settings.new.level1a.level2a.level3b
p result
=> "goodbye"
这样做的目的是获取初始方法并获取ConfigurationSettings散列的关联子散列,并将其存储到类子集的新对象中。它应用下一个方法,如果结果是另一个子散列,它将迭代以创建另一个子集,等等。它仅在不再看到散列时返回实际结果 我想在这里吃点哈西/土豆泥会对你有帮助。e、 g.ConfigurationSettings={'method_1'=>{'method_2'=>'asdf'}
Hashie::Mash.new(ConfigurationSettings).method_1.method_2
我看不出你在这里问什么,但特别是你为什么在标题和标签中提到Yaml?这个问题似乎与此无关。