[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/