Mam metodę z opcjonalnym argumentem. Jak mogę zdecydować, czy argument został podany, czy nie?Jak zdecydować, czy opcjonalny argument został podany, czy nie, w metodzie ruby
Wymyśliłem następujące rozwiązania. Zadaję to pytanie, ponieważ nie jestem w pełni zadowolony z żadnego z nich. Czy istnieje lepszy?
nil
jako wartości domyślnej
def m(a= nil)
if a.nil?
...
end
end
Wadą Ten jest, że nie może zostać podjęta decyzja, czy żaden argument lub nil
została podana.
zwyczaj NoArgument
jako wartości domyślnej
class NoArgument
end
def m(a= NoArgument.new)
if NoArgument === a
...
end
end
czy nil
dano może zostać podjęta decyzja, ale występuje ten sam problem dla wystąpień NoArgument
.
Oceniając wielkość wielokropkiem
def m(*a)
raise ArgumentError if m.size > 1
if m.size == 1
...
end
end
W tym wariancie może to być zawsze podjęta decyzja, czy opcjonalny argument został podany. Jednak metoda Proc#arity
zmieniła się z 1 na -1 (nieprawda, patrz komentarz). Wadą jest to, że dokumentacja jest gorsza i trzeba ręcznie podnieść ArgumentError.
Opcja 'arity' wszystkich swoich metod jest' -1'. Jedyną wadą ostatniego rozwiązania jest to, że trzeba ręcznie sprawdzić, czy podano nie więcej niż jeden argument i potrzebna jest dokumentacja, aby wiedzieć, jakie są argumenty. –