Feature #2017
closed
Added by naruse (Yui NARUSE) almost 15 years ago.
Updated about 13 years ago.
Description
=begin
String#/(separator) を String#join(separator) の alias として追加しませんか?
以前から、Array#*(sep) との対称性から String#/(sep) の採用は求められてきました。
しかし、対称性だけでは根拠が弱く、入ることなく今に至っています。
今回は、String#split の出現頻度を調べてみました。
Rubyのソースで調べてみると、
% grep split **/.rb|wc -l
1096
% grep gsub **/.rb|wc -l
617
% grep push **/.rb|wc -l
732
% grep to_i **/.rb|wc -l
1034
% grep to_s **/.rb|wc -l
2414
% grep each **/.rb|wc -l
4752
という結果の通り、each や to_s には負けるものの、to_i に並び、
高順位が予想された gsub をも越える使用頻度を誇っています。
これだけの頻度ならば / を割り当てるに足と思うのですが、いかがでしょうか。
もし何かに String#/ をあてるならば、String#split 以外になる可能性は低いように思います。
=end
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:39203] [Feature #2017] String#/(sep)"
on Mon, 31 Aug 2009 02:35:51 +0900, Yui NARUSE redmine@ruby-lang.org writes:
|以前から、Array#(sep) との対称性から String#/(sep) の採用は求められてきました。
|しかし、対称性だけでは根拠が弱く、入ることなく今に至っています。
|
|今回は、String#split の出現頻度を調べてみました。
|Rubyのソースで調べてみると、
|% grep split **/.rb|wc -l
| 1096
String#/は str.split(sep) の形式のものだけ数えるべきではない
でしょうか。もちろん、str / "" でも表現可能でしょうが、あま
り意図を表現しているとは思えませんから。
|これだけの頻度ならば / を割り当てるに足と思うのですが、いかがでしょうか。
|もし何かに String#/ をあてるならば、String#split 以外になる可能性は低いように思います。
それは認めます。
=end
=begin
String#/は str.split(sep) の形式のものだけ数えるべきではない
でしょうか。もちろん、str / "" でも表現可能でしょうが、あま
り意図を表現しているとは思えませんから。
ふむ、なるほど。.と(を入れてgrepするようにしてみました。
% grep '.split(' **/.rb|wc -l
430
% grep '.gsub(' **/.rb|wc -l
404
% grep '.unpack(' **/.rb|wc -l
344
% grep '.unpack(' **/.rb|wc -l
344
% grep '.sub(' **/*.rb|wc -l
640
合わせて Google Code Search で調べてみると、
lang:ruby .split( 約68,300件
lang:ruby .gsub( 約55,800件
lang:ruby .gsub( 約24,800件
lang:ruby .unpack( 約8,000件
なお、実際には String#split(sep, count) を抜かないといけないので、
仮に、lang:ruby .split([^,)]+) とすると、約59,200件でした。
=end
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:39208] [Feature #2017] String#/(sep)"
on Mon, 31 Aug 2009 20:25:40 +0900, Yui NARUSE redmine@ruby-lang.org writes:
|> String#/は str.split(sep) の形式のものだけ数えるべきではない
|> でしょうか。もちろん、str / "" でも表現可能でしょうが、あま
|> り意図を表現しているとは思えませんから。
|
|ふむ、なるほど。.と(を入れてgrepするようにしてみました。
|% grep '.split(' **/.rb|wc -l
| 430
|% grep '.gsub(' **/.rb|wc -l
| 404
|% grep '.unpack(' **/.rb|wc -l
| 344
|% grep '.unpack(' **/.rb|wc -l
| 344
|% grep '.sub(' **/*.rb|wc -l
| 640
いやいや、gsubその他は括弧は入れないで数えないと。
前回の数字と組み合わせるこうなります。
% grep split **/.rb|wc -l
1096
% grep gsub **/.rb|wc -l
617
% grep push **/.rb|wc -l
732
% grep to_i **/.rb|wc -l
1034
% grep to_s **/.rb|wc -l
2414
% grep each **/.rb|wc -l
4752
今回数えたものの中では最少ということになりますね。
いずれにしてもそれなりには需要はあるということは認めます。
=end
=begin
I don't object to this proposal, but note that it leads to unfortunate syntax when sep is a /
-delimited regex. For example:
'f o o' / / /
=> ["f", "o", "o"]
Even adding the optional parentheses doesn't help readability. Short of simply recommending people don't write ugly code, a compromise could be for String#/ to only accept String separators. (Of course if this concern has already been addressed, then I apologise in advance for intruding).
=end
=begin
成瀬です。
Yukihiro Matsumoto wrote:
今回数えたものの中では最少ということになりますね。
いずれにしてもそれなりには需要はあるということは認めます。
String の中でも特に数の多そうなものを選んで挙げていますからね。
まぁ、この点はこれ以上述べる必要はないと思います。
つまり String#/ は、
- alias 元である String#split は十分に使われている
→ 1文字メソッドを得る資格がある
- String#/ の alias 元候補に挙がりそうな別のメソッドは見当たらない
→ 割り当てを後悔する可能性は低い
までは少なくとも満たしているわけです。
で、思うにひっかかっているのは追加されて誰がうれしいの?
というところだと思うのですが、例えば
http://jarp.does.notwork.org/diary/200909a.html#200909012
の人とかはいいとして、
わたしがほしいと思ったのは、以下のような場合でしょうか。
IO.readlines("some.txt").map{|l|l.chomp!}.map{|l| l.split(",") }
IO.readlines("some.txt").map{|l|l.chomp!}.map{|l| l.split "," }
IO.readlines("some.txt").map{|l|l.chomp!}.map{|l| l / "," }
最初のものだとかっこが目立ち、かといってないのも落ち着かず、
三つ目だとシンプルにまとまるように見えます。
Run Paint Run Run さんの仰る通り、
またまつもとさんがおそらく懸念なさっている通り、
見づらく書く方法が増えるというのは確かにそうなんですが、
これがなくてもすでにそういったコードは書けるわけで、
それを懸念するよりは実際の使い分けは個々人に委ねた方が
よいのではないかと思っています。
--
NARUSE, Yui naruse@airemix.jp
=end
- Status changed from Open to Rejected
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0Like0Like0