このコードスニペットは@options
ハッシュを設定します。values
は、Array
0個以上の異種アイテムを含むものです。populate
エントリである引数を使用して呼び出す場合Hash
は、各エントリに指定した値を使用してデフォルト値を想定します。
def populate(*args)
args.each do |a|
values = nil
if (a.kind_of? Hash)
# Converts {:k => "v"} to `a = :k, values = "v"`
a, values = a.to_a.first
end
@options[:"#{a}"] ||= values ||= {}
end
end
私がやりたいのは、再帰的に移入するpopulate
ように変更することです。特別な場合があります。キーに入力しようとしている値が、(1)シンボルまたは(2)キーがシンボル(または2つの組み合わせ)であるハッシュのみで構成される配列である場合、それらは次のように扱われる必要があります。そのキーに関連付けられた値ではなくサブキー、および元の引数の評価に使用されたのと同じロジックを再帰的に再適用する必要があります。@options
populate
それを言葉にするのは少し難しかったので、私はいくつかのテストケースを書きました。いくつかのテストケースと@options
その後の期待値は次のとおりです。
populate :a
=> @options is {:a => {}}
populate :a => 42
=> @options is {:a => 42}
populate :a, :b, :c
=> @options is {:a => {}, :b => {}, :c => {}}
populate :a, :b => "apples", :c
=> @options is {:a => {}, :b => "apples", :c => {}}
populate :a => :b
=> @options is {:a => :b}
# Because [:b] is an Array consisting entirely of Symbols or
# Hashes whose keys are Symbols, we assume that :b is a subkey
# of @options[:a], rather than the value for @options[:a].
populate :a => [:b]
=> @options is {:a => {:b => {}}}
populate :a => [:b, :c => :d]
=> @options is {:a => {:b => {}, :c => :d}}
populate :a => [:a, :b, :c]
=> @options is {:a => {:a => {}, :b => {}, :c => {}}}
populate :a => [:a, :b, "c"]
=> @options is {:a => [:a, :b, "c"]}
populate :a => [:one], :b => [:two, :three => "four"]
=> @options is {:a => :one, :b => {:two => {}, :three => "four"}}
populate :a => [:one], :b => [:two => {:four => :five}, :three => "four"]
=> @options is {:a => :one,
:b => {
:two => {
:four => :five
}
},
:three => "four"
}
}
populate
ある種の再帰バージョンに対応するために署名を変更する必要がある場合は、許容されます。理論的に発生する可能性のあるネストの量に制限はありません。
私がこれをどのようにやってのけることができるかについて何か考えはありますか?