Rubyの自作メソッドで引数の位置を限定しないキーワード引数

Rubyではキーワード引数というものがある。Ruby 2.0以降から使えるようになったそうなので、もしこれを使ったメソッドを作成する時は本番環境がRuby >= 2.0であるかを確認する。

キーワード引数は通常の引数と違って順番が自由になる。引数が複数あり、全ての引数が毎度常に必須ではないようなメソッドを作成する時に便利である。
例ではmsgは必須となり、それ以降のキーワード引数をハッシュ形式で渡すことができる。

def hello(msg, names: ["Tom"], num: 1)
num.times do
puts msg + " " + names.join(" and ")
end
end
hello("Hello")
hello("Hello", names: ["Jane", "Mike"])
hello("good-bye", num: 2, names: ["Tom", "Jane", "Mike"])
# Hello Tom
# Hello Jane and Mike
# good-bye Tom and Jane and Mike
# good-bye Tom and Jane and Mike

キーワード引数で宣言されていない引数を渡そうとするとエラーが発生する。

example(Tom: "Hello")
# example.rb:7:in `<main>': unknown keyword: Tom (ArgumentError)

**argsで宣言されていない引数をまとめて引き受けることができる。

def hello(msg, names: ["Tom"], num: 1, **args)
p args
num.times do
puts msg + " " + names.join(" and ")
end
end
hello("Hello", num: 3, names: ["Tom", "Mike"], example: "test", arr: [1, 2, 3])
# {:example=>"test", :arr=>[1, 2, 3]}
# Hello Tom and Mike
# Hello Tom and Mike
# Hello Tom and Mike

Ruby 2.0以前で同様の処理を行いたい時は引数をハッシュで受け取るようにし、メソッド内部でハッシュのデフォルト値を定義しておき、引数で与えられたハッシュとマージすれば近い仕組みを実現できる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA