Tech Racho エンジニアの「?」を「!」に。
  • 開発

Ruby 2.0.0リリース! - キーワード引数を使ってみよう

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"}

まとめ

引数の定義は、「通常の引数→デフォルト値つき引数→可変長引数→キーワード引数→オプションハッシュ→ブロック引数」の順で行う必要があります。
この順番を守れば、すべてを混在させることができます。

ただ、現実にはデフォルト引数とキーワード引数を混在させる意味はあまりないですね。

関連記事

Ruby 2.1.0リリース!注目の新機能を見てみましょう


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。