Como aceitar um ou mais argumentos

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.