Ruby 2.0 admite parámetros con nombre.
def foo(bar: '12345', baz: 'abcdef') [bar, baz] end foo # => ["12345", "abcdefg"] foo(bar: 'bar') # => ["bar", "abcdef"] foo(bar: 'bar', baz: 'baz') # => ["bar", "baz"]
[2] pry(main)> require './named_parameters2' ["12345", "abcdef"] ["bar", "abcdef"] ["bar", "baz"] => trueSi se llama con un nombre no declarado se produce un
ArgumentError
:
[3] pry(main)> foo(chuchu: 'chuchu') ArgumentError: unknown keyword: chuchu from (pry):3:in `__pry__'Also, you can combine them with regular parameters.
def foo(value, bar: '12345', baz: 'abcdef') [value, bar, baz] end foo('VALUE') # => ["VALUE", "12345", "abcdefg"] foo('VALUE', bar: 'bar') # => ["VALUE", "bar", "abcdef"] foo('VALUE', bar: 'bar', baz: 'baz') # => ["VALUE", "bar", "baz"]
Se pueden combinar con splats:
[~/rubytesting/TheRubyProgrammingLanguage/Chapter6MethodsProcsLambdasAndClosures]$ cat named_parameters4.rb require 'pp' def cycle(first_value, *values, name: 'default') return [ first_value, values, name] end pp cycle(1, 2, 3, 4, name: 'Pedro') # [1, [2, 3, 4], "Pedro"]
You can stop an ArgumentError
being raised and deal with arbitrary keyword arguments by using a double-splat (double asterisk) to capture all keywords not already assigned and puts them in a hash:
[~/rubytesting/TheRubyProgrammingLanguage/Chapter6MethodsProcsLambdasAndClosures]$ cat named_parameters5.rb require 'pp' def foo(bar: '12345', baz: 'abcdef', **rest) [bar, baz, rest] end pp foo(bar: 'bar', chuchu: 'chuchu', chachi: 'chachi') # ["bar", "abcdef", {:chuchu=>"chuchu", :chachi=>"chachi"}]
Ruby 2.1 introduces required keyword arguments. You can use required argument by skipping the default value.
You’ll get a ArgumentError
if you don’t supply the argument:
def exclaim(text, exclamation: '!', number:) text + exclamation * number end exclaim('Yo', number: 5) # => 'Yo!!!!!' exclaim('Yo') # raises: ArgumentError: missing keyword: number
Casiano Rodriguez León 2015-01-07