他の回答の問題は、すべてのメソッドが「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 ハッシュの関連するサブハッシュを取得して、クラス SubSettings の新しいオブジェクトに格納することです。次のメソッドを適用し、結果が別のサブハッシュである場合は、別の SubSettings などを作成するために反復します。ハッシュが表示されなくなった場合にのみ、実際の結果を返します。