Rubyから外部コマンドを呼ぶときに-foo
のようなフラグと-bar 0
のような引数をとるものが混在したときにどうRubyで表すかという問題です。
結論としては
def baz *args
arr = []
hash = { }
args.each do |e|
if e.instance_of? Hash
hash.update e
else
arr << e
end
end
options = ""
hash.each{|k,v| options += "-#{k} #{v} "}
arr.each{|e| options += "-#{e}"}
system "command #{options}"
end
baz :foo, bar: 0
のように可変長引数で受ければ両者がごちゃまぜになったものを受け取れるのでそれを整理して整形してあげます。
用途によっては整理と整形を分けずにそのまま文字列化してもいいでしょう。
ちなみに先に引数なしのフラグ、後に引数ありのフラグの順じゃないとArgumentErrorになるようです。