Tengo un método con un argumento opcional. ¿Cómo puedo decidir si el Argumento fue dado o no?Cómo decidir si un argumento opcional se dio o no en un método de ruby
Se me ocurrieron las siguientes soluciones. Estoy haciendo esta pregunta ya que no estoy totalmente satisfecho con ninguno de ellos. Existe una mejor?
nil
como valor por defecto
def m(a= nil)
if a.nil?
...
end
end
El inconveniente de este es, que no se puede decidir si se le dio ningún argumento o nil
.
encargo NoArgument
como valor por defecto
class NoArgument
end
def m(a= NoArgument.new)
if NoArgument === a
...
end
end
Si nil
fue dado puede ser decidido, pero el mismo problema existe para los casos de NoArgument
.
Evaluación del tamaño de una elipsis
def m(*a)
raise ArgumentError if m.size > 1
if m.size == 1
...
end
end
En esta variante puede ser siempre decide si se le dio el argumento opcional. Sin embargo, el Proc#arity
de este método ha cambiado de 1 a -1 (no es cierto, vea el comentario). Todavía tiene la desventaja de ser peor para documentar y necesitar subir manualmente el ArgumentError.
El 'arity' de todos sus métodos es' -1'. El único inconveniente de la última solución es que debe verificar manualmente que no se proporcione más de un argumento y que se necesite documentación para saber cuáles son los argumentos. –