Rubyのフリップフロップ (flip-flop) 構文
Ruby技術者認定試験の勉強をしていて、初めて知った機能だったのでまとめておく。
Ruby長年やってるけど、条件式の範囲式とか初めて見た。
— 神速 (@sinsoku_listy) 2022年10月6日
5.times { (_1==2)..(_1==3) ? p(_1) : 0 } みたいなやつ。
公式ドキュメント
挙動
基本
公式ドキュメントから引用。
5.times{|n| if (n==2)..(n==3) p n end } #=> 2 # 3 5.times{|n| if (n==2)...(n==3) p n end } #=> 2 # 3
テキストの処理
複数行のテキストから範囲を取得する際に便利らしい。
以下の例ではマークダウン記法でRubyのコード部分を取得するために使用している。
input = <<-EOF The reproduction code is as follows. ### pattern 1 ```rb puts "hello" ``` ### pattern 2 ```rb puts "world" ``` EOF input.each_line do |line| puts line if (line =~ /```rb$/)..(line =~ /```$/) end #=> ```rb # puts "hello" # ``` # ```rb # puts "world" # ```
アルファベットの1, 2, 10, 11, 20, 21文字目を表示
('a'..'z').each_with_index { |x, i| print x if (i%10==0)..(i%10==1) } #=> abkluv
「..」と「...」の違い
公式ドキュメントから引用。
5.times{|n| if (n==2)..(n==2) p n end } #=> 2 5.times{|n| if (n==2)...(n==2) p n end } #=> 2 # 3 # 4
違いは分かるけど、有効な使い道がよく分からん...。
Ruby 2.6で非推奨になるも、Ruby 2.7で復活
クックパッドの記事は読んだはずなのに、フリップフロップ構文を使う機会が無さ過ぎて記憶に全く残っていなかった。
フリップフロップ構文を覚えて
資格試験のためだけに覚えるけど、仕事で使うことはないかな...