From: matz@... (Yukihiro Matsumoto) Date: 1998-09-10T10:53:18+09:00 Subject: [ruby-list:9516] Re: String#each modifies $_ まつもと ゆきひろです In message "[ruby-list:9513] String#each modifies $_" on 98/09/10, Inaba Hiroto writes: |String#each(String#each_line)がブロックを評価する時に各行を$_にセット |するという事に、ソースを見ていて気づきました。(ruby-listのバグ報告から |です) そうなってますね. 最初に仕様を考えた時のことを思い出すと「文字列を読み込む時に は $_ をセットしよう」と思ったような気がします. ですから,gets, readlines, IO#gets, IO#readlines, IO#each, String#each は $_ をセットします.あと,chopなど $_ に対して 操作を行うメソッドも $_ を変更します. その後 Ruby では $_ をあまり使わないこともあって,あまり真剣 に再検討する機会はなかったのですが,稲葉さんに指摘されてつら つらと考えると,$_ のセットされるタイミングがいまいち不明瞭 なのは確かですね.ドキュメントにも「getsなどで読み込んだ文字 列」としか書いてありませんし. そこで,以下のいずれかを選ぼうと思います. * gets, readline, IO#gets, IO#readlineの4つ,すなわち「ファ イルから一行入力するメソッド」だけが $_ をセットする.た だし,chopなどが現状のまま $_ を修正することは変わらない. # IO#eachが $_ をセットしないのは重要な非互換か. * 現状のまま.String#eachのドキュメントに $_ を変更するこ とを明記する * その他 |この仕様が便利な事があるという事はわかるのですが、(Perl屋としてはどう |せならArray#eachもそうなっている方がいいかな、とも思いますが:->) Array#eachは文字列でないので,難しいですね.もっとも,$_をデ フォルトのブロックパラメータにしてしまえば,案外すっきりする のかも知れませんがね. |この機能を使っているスクリプト/ライブラリはあるのでしょうか? うちとこにはないようです. まつもと ゆきひろ /:|)