両方使うことで、面白い使い方ができるんだなというメモ
環境
$ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin16]
実例
前提のおさらい
*引数名
で引数を好きな個数指定でき、配列に格納できる
def optional_args(*args) p args end
上のメソッドを実行すると以下のような結果になる。(出力結果はコメント表記)
optional_args("30") # ["30"] optional_args("20","30") # ["20", "30"] optional_args("20","30",:hoge) # ["20", "30", :hoge]
**引数名
で引数がキーワード引数の形式で選択された場合、キーワード名をシンボルとしたハッシュで格納される
def keyword_args(**keywords) p keywords end
上のメソッドを実行すると以下のような結果になる。(出力結果はコメント表記)
keyword_args(first_sym:1) # {:first_sym=>1} keyword_args(second_sym:"2", first_sym:1) # {:second_sym=>"2", :first_sym=>1} keyword_args(second_sym: :second, first_sym:1) # {:second_sym=>:second, :first_sym=>1}
本題
下記のように指定すると、どっちでも対応のような記述ができる
def double_args(*args,**keywords) p args p keywords end
# キーワード引数でかけば、**keywordsの方に値が入る double_args(one_sym:1) # [] # {:one_sym=>1} # 普通の引数でかけば、**argssの方に値が入る double_args("30") # ["30"] # {}
もちろん順番通り入れれば両方の値がはいる
# 普通の引数、キーワード引数というdefの設定通り入れればちゃんと入る double_args("30",first_sym:1) # ["30"] # {:first_sym=>1} # 逆にすると当たり前だけど引数の順が違うのでエラー double_args(first_sym:1,"30") # syntax error, unexpected ')', expecting => # double_args(first_sym:1,"30")