Книга: Программирование на языке Ruby
11.2.8. Опознание параметров, заданных по умолчанию
11.2.8. Опознание параметров, заданных по умолчанию
В 2004 году Ян Макдональд (Ian Macdonald) задал в списке рассылки вопрос: «Можно ли узнать, был ли параметр задан вызывающей программой или взято значение по умолчанию?» Вопрос интересный. Не каждый день он возникает, но от того не менее интересен.
Было предложено по меньшей мере три решения. Самое удачное и простое нашел Нобу Накада (Nobu Nakada). Оно приведено ниже:
def meth(a, b=(flag=true; 345))
puts "b равно #{b}, a flag равно #{flag.inspect}"
end
meth(123) # b равно 345, a flag равно true
meth(123,345) # b равно 345, a flag равно nil
meth(123,456) # b равно 456, a flag равно nil
Как видим, этот подход работает даже, если вызывающая программа явно указала значение параметра, совпадающее с подразумеваемым по умолчанию. Трюк становится очевидным, едва вы его увидите: выражение в скобках устанавливает локальную переменную flag
в true
, а затем возвращает значение по умолчанию 345. Это дань могуществу Ruby.
- 11.2.1. Отправка объекту явного сообщения
- 11.2.2. Специализация отдельного объекта
- 11.2.3. Вложенные классы и модули
- 11.2.4. Создание параметрических классов
- 11.2.5. Использование продолжений для реализации генератора
- 11.2.6. Хранение кода в виде объекта
- 11.2.7. Как работает включение модулей?
- 11.2.8. Опознание параметров, заданных по умолчанию
- 11.2.9. Делегирование или перенаправление
- 11.2.10. Автоматическое определение методов чтения и установки на уровне класса
- 11.2.11. Поддержка различных стилей программирования
- Ответный файл, используемый по умолчанию (csc.rsp)
- Выражения в значениях по умолчанию для доменов
- Значения переменных по умолчанию
- Единое имя файла параметров InterBase
- 3. Значения по умолчанию
- Параметры по умолчанию
- Использование параметров библиотек документов
- Настройка основных параметров BIOS
- Настройки по умолчанию
- Настройка дополнительных параметров BIOS
- Пропуск параметров типа
- Удалил драйвер видеокарты, а потом еще и отключил устройство по умолчанию SVGA. После перезагрузки увидел черный экран… ...