パーティーに少し遅れますが、定期的にこれを行う必要がある場合は、これに少しユーティリティメソッドを使用する価値があります-たとえば、-options
ハッシュをargs
-aryにマージし、それをマージする次のように-ハッシュが存在しない場合は、既存のハッシュ引数を使用するか、新しいハッシュとして追加するだけですargs
。
def merge_into_args!(opts={}, *args)
opts.each do |key, val|
if args.any?{|a| a.is_a?(Hash)}
args.each{|a| a.merge!(key => val) if a.is_a?(Hash)}
else
args << {key => val}
end
end
args
end
options
これは、変更されたハッシュをマージして別のメソッドに渡す場合に便利です*args
。例:
# extract options from args
options = args.extract_options!
# modify options
# ...
# ...
# merge modified options back into args and use them as args in another_method
args = merge_into_args!(options,*args)
another_method(*args)
# or as 1-liner directly in the method call:
another_method(*merge_into_args!(options,*args))
# and in your case you can conditionally modify the options-hash and merge it
# back into the args in one go like this:
another_method(*merge_into_args!(options.reverse_merge(style: 'bar'),*args))
その他の例:
# args without hash
args = ["first", "second"]
# merge appends hash
args = merge_into_args!({ foo: "bar", uk: "zok" },*args)
#=> ["first", "second", {:foo=>"bar", :uk=>"zok"}]
# Another merge appends the new options to the already existing hash:
args = merge_into_args!({ ramba: "zamba", halli: "galli" },*args)
#=> ["first", "second", {:foo=>"bar", :uk=>"zok", :ramba=>"zamba", :halli=>"galli"}]
# Existing options are updated accordingly when the provided hash contains
# identical keys:
args = merge_into_args!({ foo: "baz", uk: "ZOK!", ramba: "ZAMBA" },*args)
#=> ["first", "second", {:foo=>"baz", :uk=>"ZOK!", :ramba=>"ZAMBA", :halli=>"galli"}]