それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

RubyのFile#linenoの動作って・・・ポインタと相性悪いな。

ファイルのポインタを末尾に移動して先頭に移動しても変化しない.Each系で移動しない限りlinenoは動かない.当たり前と言えば当たり前なのだ.だけど油断してた.

実験

  1:1
  2:2
  3:3
  4:4
  5:5
  6:6
  7:7
  8:8
  9:9
 10:10

のようなファイルを作った.

ファイルを作る

>> f = open 'a.txt' ,'w'
=> #<File:a.txt>
>> (1..10).each {|i| f.print i, "\n" }
=> 1..10
>> f.close

ファイルを読み込んで見て、EOFや先頭に動かしてみる

>> f = open 'a.txt'
=> #<File:a.txt>
>> f.lineno
=> 0
>> f.seek 0, IO::SEEK_END #末尾に移動
=> 0
>> f.lineno
=> 0                      #もちろんlinenoは0
>> f.read 1
=> nil          #EOFにあるのでファイルを読み込めない
>> f.lineno = 100         #10行しかなくても100に設定できたり.
=> 100
>> f.rewind
=> 0
>> f.lineno = 1           # 1行目にセットしたら、1を読み出せる.ん?
=> 1
>> f.read 1
=> "1"
>>

ポインタなので、そりゃそうだろうとは思うけどLinenoメソッドは使い所が違うんだな.
詳しい人には当たり前だろうけどね.ちょっとビビってエントリにした.