Ruby 2.0: Les arguments nommés
Les arguments nommés étaient absents de Ruby jusqu’à sa version 2.0, curieux pour un langage qui fait tellement penser à Smalltalk.
Il était bien sûr possible de les simuler en utilisant un hash, un peu comme ce qu’on fait en Javascript:
def person(opts = {})
defaults = {name: "toto", age: 99}
opts = defaults.merge opts
puts opts[:name]
puts opts[:age]
end
Mais bof. Ça ressemble à tout sauf à du Ruby. C’est un hack, un truc, une astuce, tout ce qu’on veut mais ça ne s’intègre pas au langage. Voici la même méthode, avec cette fois-ci des arguments nommés:
def person(name: "toto", age: 99)
puts name
puts age
end
Et voici comment différentes manières d’appeler cette méthode:
person
person name: "oscar"
person age: 18
person name: "oscar", age: 18
person age: 18, name: "oscar"
Cool, ça fonctionne dans tous les sens. Par contre, pas question d’oublier le nom de l’argument:
person "oscar", 18
ArgumentError: wrong number of arguments (2 for 0)
On peut aussi mélanger arguments normaux et nommés, à condition que les arguments nommés viennent après. Le code suivant est valide:
def person(name, age: 99)
puts name
puts age
end
person "oscar"
Mais pas celui-ci:
>> def person(age: 99, name)
>> end
SyntaxError: (irb):1: syntax error, unexpected tIDENTIFIER
def person(age: 99, name)
^
À demain.