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.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Способ передачи параметров, используемый по умолчанию

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Способ передачи параметров, используемый по умолчанию По умолчанию параметр передается в функцию по значению. Попросту говоря, если не определить для аргумента модификатор, то в функцию передаётся копия переменной.// По умолчанию аргументы передаются по значению.public static


Переопределение элементов System.Object, заданных по умолчанию

Из книги ArchiCAD. Начали! автора Орлов Андрей Александрович

Переопределение элементов System.Object, заданных по умолчанию Хотя заданное по умолчанию поведение System.Object может оказаться вполне приемлемым в большинстве случаев, вполне обычным для создаваемых вами типов будет переопределение некоторых из унаследованных методов. В главе


Настройка параметров стен по умолчанию

Из книги Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT автора Фролов Александр Вячеславович

Настройка параметров стен по умолчанию Окно установки параметров стены Wall Default Settings (Настройки параметров стен по умолчанию) (рис. 5.3) вызывается нажатием кнопки – первой кнопки информационной палитры.Рассмотрим основные разделы данного окна, в которых расположены


Задание параметров функции по умолчанию

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Задание параметров функции по умолчанию Еще одна интересная возможность, которая появляется у вас после перехода от Си к Си++, позволяет при определении функций задавать некоторые ее параметры по умолчанию. Вызывая такую функцию, можно не указывать параметры, заданные по


Поиск заданных комбинаций символов

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Поиск заданных комбинаций символов Тестирование производительности путем выполнения поиска определенных текстовых шаблонов в содержимом файлов производилось с использованием трех различных методов, что позволило оценить сравнительную эффективность многопоточного


8.6.2 Маршрут по умолчанию

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

8.6.2 Маршрут по умолчанию Первой строкой в таблице 8.1 стоит маршрут по умолчанию. В ней указано, что, не найдя совпадения со строкой таблицы, трафик должен быть направлен на ближайший соседний маршрутизатор с адресом


8.7.2 Маршрут по умолчанию

Из книги Самоучитель работы на Macintosh автора Скрылина Софья

8.7.2 Маршрут по умолчанию Первой строкой в таблице стоит маршрут по умолчанию. Если не найдено ни одного совпадения, трафик будет передан на ближайший маршрутизатор с адресом


2.31. Удаление заданных символов

Из книги Linux глазами хакера автора Флёнов Михаил Евгеньевич

2.31. Удаление заданных символов Метод delete удаляет из строки те символы, которые включены в список, переданный в качестве параметра:s1 = "To be, or not to be"s2 = s1.delete("b")  # "To e, or not to e"s3 = "Veni, vidi, vici!"s4 = s3.delete(",!") # "Veni vidi vici"Этот параметр подчиняется тем же правилам, что и параметр метода count


8.1.15. Удаление заданных элементов из массива

Из книги C++ для начинающих автора Липпман Стенли

8.1.15. Удаление заданных элементов из массива В Ruby легко удалить элементы из массива - для этого даже существует много способов. Чтобы удалить элемент с известным индексом, достаточно вызвать метод delete_at:a = [10, 12, 14, 16, 18]a.delete_at(3) # Возвращает 16.# а равно [10, 12, 14, 18]a.delete_at(9) #


4.5.3. Изменение настроек, заданных по умолчанию

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

4.5.3. Изменение настроек, заданных по умолчанию По умолчанию для отображения и скрытия рабочей области приложения Dashboard используется клавиша <F12>. Но умолчания можно изменить в окне мини-утилиты Expos? и Spaces на вкладке Expos? (рис. 4.64). Для открытия этого окна следует вызвать


2.10.3. Пароли по умолчанию

Из книги автора

2.10.3. Пароли по умолчанию Многие сервисы во время установки прописывают пароли по умолчанию. В ОС Linux эта проблема стоит особо остро, потому что программы инсталляции используют RPM-пакеты и чаще всего даже не предлагают их сменить. Я бы на месте разработчиков вообще


4.1.4. Права по умолчанию

Из книги автора

4.1.4. Права по умолчанию Когда пользователь создает новый файл или директорию, то им назначаются права по умолчанию. Давайте разберем это на примере. Для создания файла выполним команду ls и перенаправим вывод в файл:ls -al >> testfileТеперь проверим права на этот файл с помощью


4.11.1. Фильтр по умолчанию

Из книги автора

4.11.1. Фильтр по умолчанию Исходя из принципа всеобщего запрета, в качестве правила по умолчанию мы должны запретить любые действия. Изначально в Linux все разрешено, а это безопасно только для отдельно стоящего сервера, который даже не подключен к сети. Проверьте ваши


14.2.1. Конструктор по умолчанию

Из книги автора

14.2.1. Конструктор по умолчанию Конструктором по умолчанию называется конструктор, который можно вызывать, не задавая аргументов. Это не значит, что такой конструктор не может принимать аргументов; просто с каждым его формальным параметром ассоциировано значение по