Ruby で インスタンス変数 に File.open を格納して複数のメソッドで each_line したらハマった

結論

こんな感じに書くと、Hoge#bar では期待通りの挙動*1にならないです。

class Hoge
  def initialize
    @file = File.open('/path/to/piyo.txt')
  end

  def foo
    @file.each_line do |line|
      puts line
    end
  end

  def bar
    @file.each_line do |line|
      puts line
    end
  end
end

hoge = Hoge.new
hoge.foo
hoge.bar

なぜか

hoge.foo によって行数のポインタが最後まで到達してしまっているから。hoge.bar では最後の行から each_line がスタートするから。

ハマった

小一時間ハマってしまった。

*1:ファイルの内容が 2回 表示されてほしい

Powered by はてなブログ