クリスマス間近なので(?)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を捕捉する旨と、サンプルコードが欲しいです。
Heroku | No such app
[ruby-list:44615]の勉強会資料を見ていて、そこだけが引っかかってしまいました。
StopIteration以外は補足しないことも強調して書いてくれるとうれしいなー。不安になってソースを見る羽目になる罠(さっきまでの俺)。ソースがドキュメントです(キリッ☆)