Rubyのフリップフロップ (flip-flop) 構文

Ruby技術者認定試験の勉強をしていて、初めて知った機能だったのでまとめておく。

公式ドキュメント

挙動

基本

公式ドキュメントから引用。

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で復活

クックパッドの記事は読んだはずなのに、フリップフロップ構文を使う機会が無さ過ぎて記憶に全く残っていなかった。

フリップフロップ構文を覚えて

資格試験のためだけに覚えるけど、仕事で使うことはないかな...