Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

until修飾子でloop系構文が不要になるケースがある

until修飾子は後置きのifみたいな感じで使える構文です。
違いは、フラグが立つまで延々と読み続けてくれること。
StringIOやSerialPortみたいな読みに行く系ライブラリでは重宝します。

実際のところ

たとえば、以前扱ったN進数リテラルが混在している文字列を切り分ける用途をStringIOで書き直す場合、

require 'stringio'

s = StringIO.new("\u0012aga\x98ga987HH")
(ary ||= []) << s.read(2) until s.eof?
p ary

てな感じでやることができます。
これは、

require 'stringio'

s = StringIO.new("\u0012aga\x98ga987HH")

until s.eof?
(ary ||= []) << s.read(2)
end
p ary

と等価です。

入り組んだ処理はメソッドにまとめてしまえば見通しよく書き直せる……かも?

参考もと

制御構造