スポンサーリンク
引数は渡す順番に依存する
普通、引数っていうのは渡す順番に依存する。
例えば、こんなdataメソッドがあるとする。↓
1 2 3 4 5 6 7 | def data name, address puts "#{name}は#{address}に住んでいます" end data "太郎", "東京" #=> 太郎は東京に住んでいます |
このdataメソッドを使う時に、引数を逆にすると変になる。↓
1 2 3 4 5 6 7 | def data name, address puts "#{name}は#{address}に住んでいます" end data "東京", "太郎" #=> 東京は太郎に住んでいます |
このように、普通、引数っていうのは渡す順番に依存する。
スポンサーリンク
キーワード引数とは?
この順番への依存を開放したのが、キーワード引数。
キーワード引数の特徴
- メソッド定義時に各引数を、key: 値の形(ハッシュ)で定義する
- メソッド呼び出し時も、key: 値の形(ハッシュ)で引数を渡す
1 2 3 4 5 6 7 | def data name: "不明", address: "不明" puts "#{name}は#{address}に住んでいます" end data name: "太郎", address: "東京" #=> 太郎は東京に住んでいます |
↑定義部分も、呼び出し部分も引数がハッシュになっているのが分かると思う。
これなら、引数の順番は気にするは必要ないし、デフォルト値がある為、引数を渡さなくてもエラーにはならないので自由な使い方ができる。↓
1 2 3 | data address: "東京", name: "太郎" #=> 太郎は東京に住んでいます |
1 2 3 | data name: "太郎" #=> 太郎は不明に住んでいます |
デフォルト値は必須ではない。
※Ruby2.0以前は必須だった。
1 2 3 | def data name:, address: puts "#{name}は#{address}に住んでいます" end |
ただしデフォルト値が無い場合は、その引数を渡さずに呼ぶと実行時エラーになる。
1 2 3 4 5 6 7 | def data name:, address: puts "#{name}は#{address}に住んでいます" end data name: "太郎" #=> エラー |
シンボル、ハッシュについてよく分からない場合は以下を参照されたし。
参考Railsでよく出てくるコロン(:)は、シンボルって言うやつらしい
参考Rubyのハッシュ(Hash)についてまとめてみた
引数がハッシュの形になっているとは言え、定義時も呼び出し時も、普通のハッシュのように{ }で囲うとエラーになるので注意。↓
1 2 3 4 5 6 7 | def data {name: "不明", address: "不明"} puts "#{name}は#{address}に住んでいます" end data {name: "太郎", address: "東京"} #=> エラー |
ただし、ネストしたハッシュの場合は{ }が必要。
1 2 3 4 5 6 7 | def hoge fuga: p fuga end hoge fuga: {foo: "bar"} #=> {:foo=>"bar"} |
1 2 3 4 5 6 7 | def hoge fuga: p fuga end hoge fuga: foo: "bar" #=> エラー |
オプション引数とは?
オプション引数というのは、key自体も自由に渡せる引数のことを言う。
オプション引数は定義時に**引数名という形で定義する。
1 2 3 4 5 6 7 8 9 10 | def data **options options.each do |key, value| puts "#{key}は#{value}" end end data 年齢: "20歳", 性別: "男性" #=> 年齢は20歳 #=> 性別は男性 |
オプション引数は、可変長引数のように数に制限なく渡すことができる。
キーワード引数と組み合わせて定義することもできる。
1 2 3 4 5 6 7 8 9 10 11 12 13 | def data name:, address:, **options puts "#{name}は#{address}に住んでいます" options.each do |key, value| puts "#{key}は#{value}" end end data name: "太郎", address: "東京", 年齢: "20歳", 性別: "男性" #=> 太郎は東京に住んでいます #=> 年齢は20歳 #=> 性別は男性 |