У меня есть метод с необязательным аргументом. Как я могу решить, был ли аргумент предоставлен или нет?Как решить, был ли предоставлен необязательный аргумент в рубиновом методе
Я придумал следующие решения. Я задаю этот вопрос, потому что я не совсем доволен ни одним из них. Существует ли там лучший?
nil
в качестве значения по умолчанию
def m(a= nil)
if a.nil?
...
end
end
Недостатком этого является то, что оно не может быть принято решение не было ли дано никаких аргументов или nil
.
NoArgument
обычай в качестве значения по умолчанию
class NoArgument
end
def m(a= NoArgument.new)
if NoArgument === a
...
end
end
ли nil
был дан может быть решена, но та же проблема существует для экземпляров NoArgument
.
Оценка размера многоточие
def m(*a)
raise ArgumentError if m.size > 1
if m.size == 1
...
end
end
В этом варианте он может быть всегда принято решение, было ли дано дополнительный аргумент. Однако Proc#arity
этого метода изменился с 1 на -1 (не верно, см. Комментарий). У него все еще есть недостаток, заключающийся в ухудшении документирования и необходимости вручную поднять ArgumentError.
Параметр 'arity' всех ваших методов' -1'. Единственным недостатком последнего решения является то, что вы должны вручную проверить, что дано не более одного аргумента, и необходима документация, чтобы знать, что такое аргументы. –