Ruby2.0の重要機能の一つ、キーワード引数を使ってみましょう。
基本的なキーワード引数の使い方
最も基本的な使い方は、以下のようなものです。
def test1(name: 'unknown', age: 0)
puts "name=#{name}, age=#{age}"
end
> test1()
name=unknown, age=0
> test1(name: 'yamada', age: 20)
name=yamada, age=20
可変長引数とデフォルト引数とキーワード引数を組み合わせる
通常の引数やデフォルト引数、可変長引数と組み合わせてみましょう。「通常の引数→デフォルト引数→可変長引数(*)→キーワード引数」の順にする必要があります。
def test2(id, type='normal', *friends, name: 'unknown', age: 0)
puts "name=#{name}, age=#{age}, type=#{type}"
puts "id=#{id} friends=#{friends}"
end
> test2(100)
name=unknown, age=0, type=normal
id=100 friends=[]
> test2(100, 'special', 2, 3, name: 'sato', age: 30)
name=sato, age=30, type=speial
id=100 friends=[2, 3]
> test2(100, 'special', 2, 3, gender: 'male', name: 'sato', age: 30)
unknown keyword: gender (ArgumentError)
キーワード引数とオプション引数を組み合わせる
さらにオプションと組み合わせてみましょう。キーワード引数に一致しない名前を渡したときに、アスタリスク2つ「**」をつけた引数で受け取れます。
def test3(id, type='normal', *friends, name: 'unknown', age: 0, **opts)
puts "name=#{name}, age=#{age}, type=#{type}"
puts "id=#{id} friends=#{friends} opts=#{opts}"
end
> test3(100, hobby: 'tennis')
name=unknown, age=0, type=normal
id=100 friends=[] opts={:hobby=>"tennis"}
> test3(100, 'special', 1, 2, gender: 'male', name: 'sato', age: 30, hobby: 'tennis' )
name=sato, age=30, type=special
id=100 friends=[1, 2] opts={:gender=>"male", :hobby=>"tennis"}
# 中括弧で囲むと可変長引数の1要素にHashを渡したことになり、意味が変わるので注意
> test3(100, 'special', 1, 2, { gender: 'male', name: 'sato' }, age: 30, hobby: 'tennis' )
name=unknown, age=30, type=special
id=100 friends=[1, 2, {:gender=>"male", :name=>"sato"}] opts={:hobby=>"tennis"}
まとめ
引数の定義は、「通常の引数→デフォルト値つき引数→可変長引数→キーワード引数→オプションハッシュ→ブロック引数」の順で行う必要があります。
この順番を守れば、すべてを混在させることができます。
ただ、現実にはデフォルト引数とキーワード引数を混在させる意味はあまりないですね。