Freqüentemente, é necessário aceitar um número variável de argumentos. Você pode ter feito assim:
def method(object_or_objects)
if object_or_objects.respond_to? :each
objects = object_or_objects
else
objects = [object_or_objects]
end
...
end
Soa familiar? Bem, existem várias maneiras que funcionam melhor com esse tipo de padrão.
Primeiro, aceita-se 1 argumento ou vários argumentos (e pode ser combinado com argumentos padrão).
# Usage:
# method(a) or method(a, b, c)
# Traps:
# method([a, b, c]) #=> [[a, b, c]]
# can be solved by calling the method as follows:
# method(*[a, b, c]) #=> [a, b, c]
def method(*objects)
# objects is always an array
end
O segundo aceita apenas 1 argumento, mas se o argumento for um único objeto ou uma matriz de objetos, ele será tratado como uma matriz.
# Usage:
# method(a) or method([a, b, c])
# Traps:
# method(a, b, c) #=> invalid number of arguments
def method(object_or_objects)
objects = Array(object_or_objects) # or the less readable = [*object_or_objects]
end
Pronto, agora você pode lidar com quantos argumentos quiser e lidar com eles como se fossem sempre um array.