1

特別な設定クラスを作成したいSettingsSettings.new.method_1.method_2.method_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 以上の "メソッド" を持つことができるように、後でより柔軟にします。

4

3 に答える 3

0

他の回答の問題は、すべてのメソッドが「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 などを作成するために反復します。ハッシュが表示されなくなった場合にのみ、実際の結果を返します。

于 2015-02-13T16:53:19.167 に答える
0

method_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
于 2015-02-13T15:26:28.420 に答える
0

これがあなたが直面している問題だと思います:

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ます。あなたが達成しようとしていることはMethod Chainingと呼ばれます。さて、オブジェクト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
于 2015-02-13T15:15:54.847 に答える