From: Inaba Hiroto Date: 1998-09-12T22:55:09+09:00 Subject: [ruby-list:9547] Re: String#each modifies $_ こちらもフォローが遅れてました。 From: matz@netlab.co.jp (Yukihiro Matsumoto) Subject: [ruby-list:9516] Re: String#each modifies $_ Date: Thu, 10 Sep 1998 10:53:18 +0900 > ですから,gets, readlines, IO#gets, IO#readlines, IO#each, > String#each は $_ をセットします.あと,chopなど $_ に対して > 操作を行うメソッドも $_ を変更します. readlinesとあるのはreadlineのタイプミスですね。 > そこで,以下のいずれかを選ぼうと思います. > > * gets, readline, IO#gets, IO#readlineの4つ,すなわち「ファ > イルから一行入力するメソッド」だけが $_ をセットする.た > だし,chopなどが現状のまま $_ を修正することは変わらない. > > # IO#eachが $_ をセットしないのは重要な非互換か. 個人的には、こうなってくれれば文句なしです。IO#eachの非互換は気になり ますが。 > * 現状のまま.String#eachのドキュメントに $_ を変更するこ > とを明記する これでも良いのですが、String#each以外のgets等の説明のところにも$_が変 更される事が書いてないので、それらもお願いします。getsがwhile()の中で なくても$_を変更する、というのはPerlから来た人には明記して欲しいところ です。 えっと、このメールを書きながらrubyをいじっていて気がついたのですが、 IO#eachとString#eachには以下の違いがあります。 % echo a | ruby -e '$_ = "x"; $stdin.each{ p $_ }; p $_' "a\n" nil % ruby -e '$_ = "x"; "a\n".each{ p $_ }; p $_' "a\n" "a\n" > |この仕様が便利な事があるという事はわかるのですが、(Perl屋としてはどう > |せならArray#eachもそうなっている方がいいかな、とも思いますが:->) > > Array#eachは文字列でないので,難しいですね.もっとも,$_をデ > フォルトのブロックパラメータにしてしまえば,案外すっきりする > のかも知れませんがね. 確かに自分はすっきりします。でもいまからそうすると、非互換性が大きずぎ そうですね:-> -- 稲葉 浩人 (inaba@st.rim.or.jp)