Вопрос по ruby, flip-flop – Когда будет полезен Рубиновый триггер?

20

Думаю, я понимаю, как работает триггер, благодаря учебнику, но пример здесь придуман только для обучения. Кто-нибудь может привести пример того, как вы на самом деле использовали или использовали бы триггер?

Я ищу реальное приложение, а не просто еще одну демонстрацию. Какие проблемы может решить этот инструмент?

Ссылка раньше былаhttp://vision-media.ca/resources/ruby/ruby-flip-flop-or-range-operators, но, кажется, спам в эти дни.

Ваш Ответ

3   ответа
8

в. Я использовал этот оператор для извлечения фрагментов текста на основе регулярных выражений.

Я писал инструмент для запуска команд на удаленном сервере через Net :: SSH. Этот конкретный сервер имел досадную привычку печатать MOTD независимо от того, был ли сеанс сеансом входа в систему или нет. Это привело к возвращению большого количества мусора, когда я запустил команду и получил вывод. Поскольку у меня не было большого влияния в настройке сервера, я создал небольшой скрипт, который распечатывал разделитель, запускал программу и затем печатал другой разделитель. Вывод выглядел примерно так.

Welcome to Server X!

+----------------------------------------------------------------------+
| Use of this server is restricted to authorized users only. User      |
| activity may be monitored and disclosed to law enforcement personnel |
| if any possible criminal activity is detected.                       |
+----------------------------------------------------------------------+

----------------------------------------------
    Setting up environment for user Adam. 
----------------------------------------------

>>>>>>>>>>>>>>>>>>>>>>>>>
Program Output
<<<<<<<<<<<<<<<<<<<<<<<<<

Оператор триггера был полезным сочетанием клавиш для извлечения только части кода с нужным мне выводом. Я использовал регулярное выражение, которое соответствует 25 больше, чем "& gt;" чтобы начать матч, и 25 меньше чем & lt; & quot; чтобы закончить матч.

output.each { |line| puts line if line[/^>{25}/] .. line[/^<{25}/] }

Output

>>>>>>>>>>>>>>>>>>>>>>>>>
Program Output
<<<<<<<<<<<<<<<<<<<<<<<<<

Большинство примеров, которые я видел, были связаны с извлечением фрагментов данных из файла или массивов на основе регулярных выражений. Некоторые другие примеры, которые приходят на ум, - это удаление конфликтов git merge, некоторые записи из устаревших плоских файловых систем (например, структуры, записанные в файл) и файлы журнала.

По существу, каждый раз, когда вам нужно извлекать разделы, основанные на начальных и конечных данных, а не только на содержимом отдельной строки. Это немного сложнее, чем простое регулярное выражение, но менее сложно, чем написание парсера.

4

строк может показаться правильным вариантом использования.

Я писал что-то не так элегантно, как выше, несколько раз в прошлом при рендеринге таблиц в Rails.

20

статья rubycentral.com) где вы печатаете только определенные строки из файла:

file = File.open("ordinal")
while file.gets
    print if ($_ =~ /third/) .. ($_ =~ /fifth/)
end

Это предполагает, что у вас есть файл со следующим содержимым:

first
second
third
fourth
fifth
sixth

Программа распечатает только:

third
fourth
fifth

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

Забудьте о 3 и 5. Это касается извлечения части файла, разделенной начальным тегом и конечным тегом. Я надеюсь, вы лучше поймете, почему это пример из реального мира. Теперь эквивалентная версия без триггера будет включать добавление переменной для состояния, больше операторов if: просто более сложный код.
-1: непроверенный код Как вы думаете, это Perl? тебе нужноprint if ($_ =~ /third/) .. ($_ =~ /fifth/) (Я знаю, что это не ваш код, но нет необходимости продолжать распространять код, который использует устаревшие функции).
& # X2026; это не диапазон. Вы совершенно неправильно поняли оператора триггера. Это тот же самый синтаксис, который в данном контексте означает совершенно другое. (Никто никогда не говорил, что синтаксис Ruby прост:j.mp/cu0eFz - и это крайне неполноценно!)
Вау, теперь я вижу объектно-ориентированную природу моего рубина настолько мощную ... используя диапазоны таким образом. Просто удивительно!
Каково реальное использование для этого? Когда мне может понадобиться напечатать 3–5 строки из файла (достаточно времени, чтобы его можно было кодировать)? kajaco

Похожие вопросы