..
hoặc flip-flop được kế thừa từ Perl lấy từ AWK và sed trong * nix. Nó rất mạnh mẽ, nhưng trong sử dụng cụ thể của bạn nó khá mơ hồ và không phải là một lựa chọn tốt cho logic bạn muốn, đặc biệt là trong Ruby. Thay vì sử dụng:
(1..10).each {|x| puts x if (3..5) === x }
Những kết quả đầu ra:
3
4
5
Điều đó nói rằng, nó là vô cùng mạnh mẽ khi bạn cần để trích xuất một loạt các dòng từ một tập tin:
File.foreach('/usr/share/dict/propernames') { |li| puts li if ($. == 5 .. $. == 7) }
Những kết quả đầu ra:
Agatha
Ahmed
Ahmet
Pe rl cho phép một biểu hiện thậm chí còn khó hiểu hơn chỉ sử dụng số dòng của dòng hiện đang đọc (AKA $.
) nhưng Ruby không hỗ trợ điều đó.
Ngoài ra còn có tùy chọn sử dụng biểu thức thông thường, mà cư xử tương tự như việc so sánh theo thời gian:
File.foreach('/usr/share/dict/propernames') { |li| puts li if (li[/^Wa/] .. li[/^We/]) }
Những kết quả đầu ra:
Wade
Walt
Walter
Warren
Wayne
Wendell
Bởi vì công việc regex, nó có thể tạo ra một mô hình phức tạp để truy xuất các dòng từ một tệp dựa trên các kết quả phù hợp. Là lần đầu tiên, sau đó kích hoạt mẫu thứ hai, dòng được bắt. Nếu, sau này trong tệp, một dòng khác sẽ kích hoạt mẫu đầu tiên, việc ghi lại sẽ xuất hiện lại cho đến khi mẫu thứ hai khớp với nhau. Đó là tuyệt vời mạnh mẽ:
File.foreach('/usr/share/dict/propernames') { |li| puts li if (
li[/^Am/] .. li[/^An/] or
li[/^Wa/] .. li[/^We/]
)
}
Những kết quả đầu ra:
Amanda
Amarth
Amedeo
Ami
Amigo
Amir
Amos
Amy
Anatole
Wade
Walt
Walter
Warren
Wayne
Wendell
Hoặc luân phiên, cho bạn bè nói mơ hồ-mã của chúng tôi:
File.foreach('/usr/share/dict/propernames') { |li| puts li if (li[/^(?:Am|Wa)/] .. li[/^(?:An|We)/]) }
liên kết tài liệu, vui lòng .. –
Bạn đã trả lời câu hỏi của riêng mình. 'và tiếp tục đúng cho đến khi x == 5' – MurifoX
nhưng khi x trở thành 5, nó là sai phải không? làm thế nào có thể 5 được in sau đó? – bean