コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Rubyの関数の引数では可変長引数と可変長キーワード引数で便利な使い方ができる

両方使うことで、面白い使い方ができるんだなというメモ

環境

$ 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")

参考リンク