[ruby-list:45962] Re: 質問: String#lines の挙動について

From: rubikitch@...
Date: 2009-04-14 13:32:58 UTC
List: ruby-list #45962
From: Ginga Baba <ginga@nifty.com>
Subject: [ruby-list:45961] 質問: String#lines の挙動について
Date: Tue, 14 Apr 2009 21:57:52 +0900

るびきちです。

> Ruby1.8.7 および Ruby1.9 において、
> String#lines は String#each_line の別名メソッドであると認識していましたが、
> File オブジェクトをレシーバにし、ブロック付きでメソッドを呼び出すと、挙動
> が異なるようです。

File オブジェクトをレシーバにしている時点で String#lines は呼ばれません。

> --test1.rb---------------------
> File.open("test.txt") { |f|
>   f.lines {|line| print line }
> }
> ------------------------------
> 
> では、出力されません。

ここでは IO#lines が呼ばれます。
f.read とすれば String#lines が呼ばれるので出力されます。

File.open("test.txt") { |f|
  f.read.lines {|line| print line }
}
# >> aa
# >> bb
# >> cc

しかし、妙ですね。 String#lines と String#each_line 、 ARGF.line と
ARGF.each_line は同じ関数を呼んでいるのに対し、 IO#lines と IO#each_line は
別々の関数を呼んでいますね。

### io.c
   5986:    rb_define_method(rb_cIO, "each_line",  rb_io_each_line, -1);
   5989:    rb_define_method(rb_cIO, "lines",  rb_io_lines, -1);
   6080:    rb_define_singleton_method(argf, "each_line",  argf_each_line, -1);
   6083:    rb_define_singleton_method(argf, "lines",  argf_each_line, -1);

### string.c
   5124:    rb_define_method(rb_cString, "each_line", rb_str_each_line, -1);
   5129:    rb_define_method(rb_cString, "lines", rb_str_each_line, -1);
   
--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/



   

In This Thread