From: matz@... (Yukihiro Matsumoto) Date: 1998-09-14T10:44:08+09:00 Subject: [ruby-list:9555] Re: String#each modifies $_ まつもと ゆきひろです In message "Re: [ruby-list:9547] Re: String#each modifies $_" on 98/09/14, inaba@st.rim.or.jp writes: |> ですから,gets, readlines, IO#gets, IO#readlines, IO#each, |> String#each は $_ をセットします.あと,chopなど $_ に対して |> 操作を行うメソッドも $_ を変更します. | |readlinesとあるのはreadlineのタイプミスですね。 いや,readlinesです.これは内部でgetsを使ってるんで $_ の値 が変わっちゃうんです.readlineはgetsと挙動が同じなんで省略し ました. |> * gets, readline, IO#gets, IO#readlineの4つ,すなわち「ファ |> イルから一行入力するメソッド」だけが $_ をセットする.た |> だし,chopなどが現状のまま $_ を修正することは変わらない. |> |> # IO#eachが $_ をセットしないのは重要な非互換か. | |個人的には、こうなってくれれば文句なしです。IO#eachの非互換は気になり |ますが。 個人的にはこちらに傾いています.賛成して頂けるかしら? # 変更するとしても1.1dからになります. |> * 現状のまま.String#eachのドキュメントに $_ を変更するこ |> とを明記する | |これでも良いのですが、String#each以外のgets等の説明のところにも$_が変 |更される事が書いてないので、それらもお願いします。getsがwhile()の中で |なくても$_を変更する、というのはPerlから来た人には明記して欲しいところ |です。 いずれにしても $_ を変更するメソッドにはそのことを明示しよう と思います. |えっと、このメールを書きながらrubyをいじっていて気がついたのですが、 |IO#eachとString#eachには以下の違いがあります。 そうですね.指摘ありがとうございます.現状の挙動を維持するな らここを修正します.ファイル入力からに限定するなら,この部分 はそもそもなくちゃいますけどね.