Rubyのキーワード引数で遊んでみる
まだ試していなかったので少し遊んでみました。
Ruby 2.1.2
まずはオーソドックスな形から。
def language name: "Java", ver: "1.8" puts "name: #{name} ver: #{ver}" end language name: "Ruby", ver: "2.1.2" # => name: Ruby ver: 2.1.2
引数を何も渡さなければもちろんデフォルト値です。
def language name: "Java", ver: "1.8" puts "name: #{name} ver: #{ver}" end language # => name: Java ver: 1.8
Hashで渡しても大丈夫です。
def language name: "Java", ver: "1.8" puts "name: #{name} ver: #{ver}" end language({name: "Ruby", ver: "2.1.2"}) # => name: Ruby ver: 2.1.2
引数に存在しないキーワードを渡すとエラーとなります。
def language name: "Java", ver: "1.8" puts "name: #{name} ver: #{ver}" end language name: "Ruby", ver: "2.1.2", license: "BSD" # => unknown keyword: license (ArgumentError)
これは引数に**を付与することで抑制することができます。*1
def language( name: "Java", ver: "1.8", ** ) puts "name: #{name} ver: #{ver}" end language name: "Ruby", ver: "2.1.2", license: "BSD" # => name: Ruby ver: 2.1.2
キーワードが重複しているとメソッドのコンパイル時にエラーとなります。
def language name: "Java", ver: "1.8", ver: "1.7" puts "name: #{name} ver: #{ver}" end # => duplicated argument name
渡した引数のキーワードが重複していると、後に記述したものが優先されます。 これはHashと同様の挙動です。
def language name: "Java", ver: "1.8" puts "name: #{name} ver: #{ver}" end language name: "Ruby", ver: "2.1.2", name: "Node.js", ver: "0.11.11" # => name: Node.js ver: 0.11.11