Триггер (программирование)
Эта статья нуждается в дополнительных цитатах для проверки . ( март 2024 г. ) |
В компьютерном программировании триггер — это редко используемая синтаксическая конструкция , которая позволяет логическому значению переключаться с ложного на истинное при выполнении первого условия, а затем обратно на ложное при выполнении второго условия. Синтаксис доступен на языках программирования Perl. [1] и Руби . [2] Аналогичная логика доступна в sed и awk . [1]
Триггер с первым условием A и вторым условием B не эквивалентен варианту «если A, а не B», поскольку первый имеет постоянное состояние и является истинным, даже если A больше не является истинным, пока в какой-то момент в прошлом А было правдой, а Б всегда было ложью.
Хорошей аналогией может быть то, что даже если А не является истиной, а Б — истиной, он все равно поверит А.
Пример
[ редактировать ]Следующий код Ruby печатает числа от 4 до 6:
(1..10).each do |x| puts x if (x == 4 .. x == 6) end
Первый экземпляр «..» — это оператор диапазона , который производит перечисление целых чисел от 1 до 10. Второй «..» — это оператор триггера, также известный как оператор триггера. [3] Обратите внимание, что число 5 печатается, даже если оба значения «x == 4» и «x== 6» являются ложными. Это связано с тем, что выражение запоминает, что «x == 4» было истинным на предыдущей итерации, и что «x == 6» в тот момент никогда не было истинным.
Подводные камни
[ редактировать ]Оператору триггера необходимо сохранить свое текущее состояние. У программиста нет возможности явно определить, где хранится это состояние и каково его время жизни. Время жизни имеет значение, когда один и тот же код используется несколькими потоками или в рекурсивных функциях. Этот одновременный доступ к состоянию оператора триггера может привести к неопределенному поведению или, по крайней мере, к неожиданным результатам, в зависимости от языка программирования. Например, в Perl каждый триггерный оператор имеет свое собственное состояние, общее для всех потоков. [4] другие языки программирования делают то же самое.
Чтобы обойти это ограничение, оператор триггера должен быть смоделирован как абстрактный тип данных, параметризованный с помощью:
- предикат, который сообщает, включать ли триггер,
- предикат, указывающий, следует ли выключать триггер.
Этот тип данных триггера предоставит функцию, которая одновременно запрашивает и обновляет свое состояние. Эта функция получает фактические данные, от которых зависят предикаты переключения, и при необходимости передает эти данные двум предикатам.
Из-за этой присущей ему сложности лишь немногие языки программирования приняли оператор триггера.
Ссылки
[ редактировать ]- ^ Jump up to: а б «Операторы Perl и приоритет» . Проверено 21 октября 2016 г.
- ^ Нитин Бекал (21 ноября 2014 г.). «Оператор флип-флопа в Ruby» .
- ^ «Молниеносный доклад PyCon Australia: операторы флип-флопа (флип-флоператоры)» . 26 августа 2018 г.
- ^ «Оператор диапазона в Perl» . 16.08.2020.