スポンサーリンク
引数は渡す順番に依存する
普通、引数っていうのは渡す順番に依存する。
例えば、こんな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歳 #=> 性別は男性 | 

 
 
 
 