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 on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。得意分野はWeb全般、Ruby on Rails、Androidアプリケーションなど。最近はBlinkと格闘中。軽度の資格マニアで、情報処理技術者試験(高度10区分)などを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ