From: Kazunori NISHI Date: 1999-12-01T04:51:00+09:00 Subject: [ruby-dev:8463] Re: [REQ] {enumerable, integer, range}.rand 西@九大です。 From: matz@netlab.co.jp (Yukihiro Matsumoto) > でも、それって rand ではなく、shuffleとかrandomizeではないで > すかねえ。 それは、「名前」的な問題(Kernel#rand と名前が衝突しているから)ですか? それとも「機能」的な問題(要素を全部入れ変えた方が汎用的)ですか? 提案された名前から、前者ではないと思いますが。(前者はむしろ肯定したい、 という気持ちは後述)。で、後者だとしても * (! だとすると) self 自身の順序は保ちたい * (! でなければ) shuffle.shift などは高価過ぎる という理由から、rand でいいと思います。あくまで rand(array[array.size]) と等機能のメソッドを意図してます。これとは別に、shuffle(!)/randomize(!) もあってよいと思います。 > (1) 名前が適切ならば採用か。ただし、EnumerableかArrayかは > まだ考慮の余地あり。 上の理由から、Enumerable#rand でよいと思います。(Kernel#rand との衝突 を問題にしているのであれば、Enumerable#random でも) 多分、Enumerable と Array の選択は、shuffle/randomize を想定した時に起 きる問題だと思います。確かにその場合は、Enumerable(Set?) が順序を持つ? 元から乱数的では?という疑問があります。(そこには触れたくないらしい) > (2) 「ある範囲の乱数」は欲しいかも。インタフェースは考慮の > 余地あり。 これは、ごとけんさんの rand(range) 案に賛成です。でも range オブジェク トを生成するコストは無視していいんですかね?(ここらへんの実装上のコス トは想像つかないらしい)。で、いっそ rand(Numeric/Range/Enumerable) に してもいい気がしてます。 > (3) 整数のメソッドとしてはやや不適切な臭いが。 私もこれはやり過ぎだと思いますが、ちょっと抵抗してみます。(暇なのか?) オブジェクト指向において、10.print 等は両者に相関性が無い事から不自然 ですが、10.rand, 10.sin などは自然で、(OO的には)むしろ本来のあるべき姿 だと思います。これは、 rand や sin という機能には数(Numeric)が不可欠であり、その「数」が それらの機能を持つ(メソッドを持つ)のは自然である。 と考えるからです。しかし、人間の思考においては、特に sin 等は、これま での(その人の)経験から、「数学」での考え方(表記法)に従う方が可読性が高 い為に、ruby では数学の関数的な表現法をとっている。。。 #個人的には、この前向きな妥協が、Smalltalk より Ruby が好きな点です 私はこういう捉え方だったので、なぜ rand(10) だけ残って 10.rand がない んだろう、という疑問が湧きました。確かにあっても(私も)使わないでしょう が、そういう流れであれば、残っているべきではないのか?と。 でも、そういう流れじゃないんですよね、多分。(抵抗して自己解決する奴)。 ていうか、Math.sin(10) じゃないとエラーになるし。(sin(10) が通ると思っ てた人の言い分) rand も、元はシステムコール(カーネル/OS)に依存するから Kernel.rand(10) であり、「そこらへんは冗長だからもういいよね。もっと気軽に行こうよ」的 思想から、rand となった。という経緯だと推測しています。 ------------------------------------------------------------------ 九州大学大学院システム情報科学研究科 情報工学専攻 博士後期課程三年 西 和則 ( e-mail: kazunori@swlab.csce.kyushu-u.ac.jp ) ------------------------------------------------------------------ #「第2話、10.print は悪か?」に続く..