From: Kazunori NISHI Date: 2000-01-13T06:05:53+09:00 Subject: [ruby-dev:8923] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num) 西@九大です。 From: Minero Aoki > つまり、splice は範囲のある削除の用途で使われることがほとんどであり、 > Ruby では範囲のある delete_at と slice! が採用されれば splice は > 全く不要であると言ってよいでしょう。 ... > splice ARRAY add or remove elements anywhere in array > ^^^^ > という記述を発見。これは Perl を使ってる人自身の意識を如実に > 反映しているのでは? どうも御苦労様でした。お蔭様で、納得する事ができました。という事で、 Array#splice は不要です。(コウモリ)。後は、他スレッドの Array#extract Array#delete_at Array#slice/slice! 系の行方次第という事で。 > []= は相当使うのでそのたびに配列が生成されるのはさすがに厳しいものが > あります。 あ、そうですね。実装に疎いと、実行時のコストを見落としがち、というか、 気付かない事が多いです。OO がいくら実行速度を優先しないと言っても、言 語設計(実装)レベルで、そういう無駄な処理は論外ですね。勉強になります。 > Ruby ではユーザが勝手に既存クラスにメソッドを追加できるので、 > 組みこみライブラリにいれるハードルは高くてもいいと思います。 前にも言いましたが、私はなるべく多くの機能が組み込みで提供される事を望 みます。もちろん「機能的に正しく、よい名前であれば」という条件節は設け ますが。理由は、 [1] 各ライブラリ及びユーザ独自の定義における名前衝突の危険性 [2] 豊富な機能による利便性と豊富な語彙による可読性 です。[1]は、その可能性とそれが引き起こす誤動作が自明なので異論はない でしょうが、[2]に関しては、殆ど精神論に近く、多少妄想が入ってるかもし れないので、興味のない方は読み飛ばして下さい。(意訳:次のメールへ) いくら「後から追加できる」「簡単に定義できる」と言っても、使う側として は、自分が望む物がやはり最初から存在している(定義してある)方が便利です。 'a' と 'b' という2つのメソッドを連続して呼ぶ事が一度でもあれば、それを 'c' という組み込みメソッドとして用意しておいた方がいいと思っています。 確かに「簡単に後から定義できるんだから、自分で好きなようにやれ」と言わ れそうですが(ていうか、言われてる)、Ruby と自然言語を対応づけて考える と少しはわかってもらえるかもしれません。 私のイメージ的には(例えば「日本語」で考えると)、「平仮名さえ定義されて いれば文章はかけるじゃん」と言われているような気分なのです。確かに平仮 名だけでも文章は書けますが、漢字があるとより便利。平仮名だけの文章に比 べると、焦点がボケ難く、より本質的な情報を伝え易い(可読性も高い)です。 平仮名(プリミティブなメソッド)の組み合わせで漢字(複合メソッド)相当もの を表現する事も可能ですが、若者(入門者)が妙な当て字(妙なメソッド)を作り、 それらが流布する危険性や耐え難さ、そして言語自身への悪影響を考えると、 言語として最初から用意(定義)しておくべきではないのか。 その場合、生涯一度も使わないであろう単語も多く存在し、「豊富な語彙」と いう名の下に、同じ意味を表す多くの異なる単語が存在してしまうが、そこに は微妙なニュアンスがあり、それらがピタリとはまった時の文章(コード)の美 しさと爽快感は素晴しい、、、など、徒然と思っていますが、長くなるので、 このへんで。(最後がうまくまとまらなかったらしい) 要するに、言語自身が悪い言葉を持たない為の「ハードルの高さ」(機能的に 間違ってないか?名前は適切か?)はあって然るべきだと思いますが、それ以 上、少しでも敷居を高くする事には反対です。むしろ、上記の理由から、それ を越えたものは積極的に取り込むべきであると。よって、「ユーザが勝手に既 存クラスにメソッドを追加できる」というのは言語の特徴にすぎず、その根拠 になるとは感じられないのです。 ------------------------------------------------------------------ 九州大学大学院システム情報科学研究科 情報工学専攻 博士後期課程三年 西 和則 ( e-mail: kazunori@swlab.csce.kyushu-u.ac.jp ) ------------------------------------------------------------------