好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

while true を loop と書いてはいけない

クリスマス間近なので(?)Ruby 1.9 で遊んでたらちょっと引っかかったのでメモ。

無限ループを while true でなく loop で書いている人は、Ruby 1.9 を使う時に気をつけてね!(さっきまでの俺)

#! ruby
# -*- encoding: CP932 -*-

# sample.rb
f = 1.upto(3)

loop do
  p f.next
end

while true
  p f.next
end

C:\sample\ruby>ruby -v
ruby 1.9.1 (2008-10-28 revision 19983) [i386-mswin32]

C:\sample\ruby>ruby sample.rb
1
2
3
1
2
3
sample.rb:12:in `next': iteration reached at end (StopIteration)
from sample.rb:12:in `

'

Kernel#loop は StopIteration を捕捉するらしい*1。知っていれば便利だけど、激しくはまりそうなんですが(さっきまでの俺)。でも、たしかに便利。

StopIteration になると最初に戻るのが微妙にキモイな。まぁ、どっちでもいいけど。

関連

ちなみに loop より while true が好きだ。なんでかって言うと、たぶんスコープが変わらないからだな。

LoveRubyNet Wiki: RubyCodingStyle

1.9 の時代が来ても青木さんのコーディングスタイルはステキでした。

1.9.0版のKernel.#loopの説明としてStopIterationを捕捉する旨と、サンプルコードが欲しいです。
[ruby-list:44615]の勉強会資料を見ていて、そこだけが引っかかってしまいました。

Heroku | No such app

StopIteration以外は補足しないことも強調して書いてくれるとうれしいなー。不安になってソースを見る羽目になる罠(さっきまでの俺)。ソースがドキュメントです(キリッ☆)