..
lub flip-flop jest dziedziczone z Perla, który dostał go od AWK i sed w * nix. Jest bardzo potężny, ale w twoim konkretnym zastosowaniu jest dość mało znany i nie jest dobrym wyborem dla logiki, którą chcesz, szczególnie w Ruby. Zamiast używać:
(1..10).each {|x| puts x if (3..5) === x }
które wyjścia:
3
4
5
Powiedział, że jest to bardzo silny, gdy trzeba wyodrębnić zakres wierszy z pliku:
File.foreach('/usr/share/dict/propernames') { |li| puts li if ($. == 5 .. $. == 7) }
które wyjścia:
Agatha
Ahmed
Ahmet
Pe rl pozwala na jeszcze bardziej wyraziste wyrażenie, używając tylko numerów linii aktualnie czytanej linii (AKA $.
), ale Ruby nie obsługuje tego.
Istnieje również możliwość korzystania z wyrażeń regularnych, które zachowują się podobnie jak poprzedni porównania:
File.foreach('/usr/share/dict/propernames') { |li| puts li if (li[/^Wa/] .. li[/^We/]) }
które wyjścia:
Wade
Walt
Walter
Warren
Wayne
Wendell
Ponieważ regex pracy, to jest możliwe, aby utworzyć złożony wzór do pobierz linie z pliku na podstawie dopasowań. Jako pierwszy, a następnie drugi spust schematu, linie są przechwytywane. Jeśli później w pliku kolejna linia wyzwoli pierwszy wzorzec, przechwytywanie pojawi się ponownie, dopóki drugi wzór nie pasuje. To cudownie potężny:
File.foreach('/usr/share/dict/propernames') { |li| puts li if (
li[/^Am/] .. li[/^An/] or
li[/^Wa/] .. li[/^We/]
)
}
które wyjścia:
Amanda
Amarth
Amedeo
Ami
Amigo
Amir
Amos
Amy
Anatole
Wade
Walt
Walter
Warren
Wayne
Wendell
lub na przemian, na naszych niejasne kodowych języcznych przyjaciół:
File.foreach('/usr/share/dict/propernames') { |li| puts li if (li[/^(?:Am|Wa)/] .. li[/^(?:An|We)/]) }
link dokumentacji proszę .. –
Odpowiedziałeś na własne pytanie. 'i nadal są prawdziwe, dopóki x == 5' – MurifoX
, ale kiedy x stanie się 5, to jest fałszywe prawda? jak wtedy można wydrukować 5? – bean