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