西@九大です。
#引用の順番は変更してます。

From: matz / netlab.co.jp (Yukihiro Matsumoto)
> |  * Kernel#rand(min..max)/(min, max)?   ⇒ よさそう
...
> 最初のはまだ私の中で結論出てません。

確かに。「rand(3C) を連想するから」という理由で納得しているので、もし
「それ以外の使い方(引数)」を認めるなら、何でも認めて欲しいところです。
多分、またギャーギャー言い出すでしょう。でも、最悪、それだけでも欲しい、
とか思ってたりもします。(今日のジレンマ)

> ではありません。関数的に見えた方が自然なものは関数的に見えた
> 方が良く、メソッド的に見えた方が自然なものはメソッド的に見え
> た方が良いというのが私の一貫したスタンス(のつもり)です。

これが見えていませんでした。こういうスタンスなら、まつもとさんが納得さ
れない理由もわかります。今迄の議論が軽く吹き飛ぶくらい、全てが一気に理
解(納得)できました。(説得できないであろう事も)。あまりにあっけなかった
ので、返事を忘れてました。。。(遅レスの精一杯の言い訳)

ていうか、それ(スタンス)自身には納得してませんが、それはスタイルや信念
みたいなものなので、人それぞれという事で問題ないです。はい。

> (概念としての)ある処理をまとめる方法は、オブジェクト指向言語
> にはダイナミックバインディングがあります。つまり、おなじメソッ
> ド名と引数パターンを持つメソッドは、それらが別々のクラスで定

要するに「single dispatch」ですね。はい。

> double dispatchは「メソッドはひとつのオブジェクト(レシーバ) 
> によって選択されるが、ふたつの(かなり無理すれば複数)のオブジェ

はい。本質的ではないですが、「double」だけに2つかも。「multiple
dispatch」という言葉は一般的ですか?

> ですが、「統一的に受ける窓口」とはなんで、なんのためであろう
> かという疑問が残ります。

哲学的ですね。という事は、最後はまた「スタンス(ポリシー)」という話にな
りそうですが、自分の立場を明確にする為にお答えしましょう(土台固め)。て
いうか、今迄の議論における意見の相違はそこにあったので。

何の為か?「愛と平和の為」。何なのか?「その実現手段の1つ」です。(よく
わかってないらしい)。はい、ちょっと抽象的で難しいです。

「プログラミング」という領域で答えるならば、「従来のプログラミングにお
ける(本来は不要な)制限である、名前空間の汚染問題を解消する手段」ぐらい
でしょうか。

これになぞって今迄の話をまとめると、従来のプログラミングパラダイムには、

get_random_integer(integer)
get_random_value_from_range(range)
get_random_value_from_collection(collection)

という「名前空間の汚染」があり、それに起因する「ユーザへの負荷」(関数
名を多く覚える必要がある)もあるので、普通はやってられない。(OO な人の
言い分)。で、それを解決する手段として、

  [1] single dispatch でいいじゃん。(まつもとさん)
      (integer/range/collection)#get_random_value

  [2] double dispatch でもいいじゃん。(情緒不安定な人)
      Kernel#rand(integer/range/collection)

  [3] どっちでもいいじゃん。(多くの ruby-dev な人)

がある訳ですね。確かに上の問題は [1]で解決されてます。で、[2]にする必
要はないのでは?果たして「統一的な窓口(rand)」は必要なのか?ていうか、
それって何?存在意義は?というのが先の質問ですね。そして、

> しかし、今回は別に乱数発生源とcollectionを組み合わせて選択す
> るというニーズが存在しないので、わざわざdouble dispatchを選
> 択する理由も、そのためのくくり(Kernel#rand)を導入する必然性
> もありません。

なんですね。はい、物凄く理解できます。でも、私は「double dispatch」と
は単にそういう「受け手の型が2つに増える(組み合わせられる)」だけでなく、
その「くくり」もメリットだと思うのです。これが選択する理由です。
#良い例が思いつかないので、間違ってるかも。。。(今日の弱気)

「導入する必然性」については、どこかの登山家ではないですが、「そこに
Kernel#rand があるから」です。「Kernel#get_random_value を新規作成して、
意地でも double dispatch」というのではないです。何かもったい気がするん
ですよね。せっかく「くくり(窓口)」はあるのに使っちゃダメ、みたいな。
便利なんだから、コンビニで住民票を取らせてよ、みたいな。

> さらに現在既にKernel#rand()は「1個の整数を引数にとる」という
> 仕様になっていますから(これを変えるつもりはない)、

がーん。そこまで言われたら、もうどーしよーもないです。でも、今迄の理由
から納得する事は十分にできますです。はい。

>   * 関数のように思えないものを関数的にする

rand(integer) が関数的に自然であるならば、rand(collection) も自然に感
じられるのですが。まあ、「自然=(その人にとって)自然」の法則ですけど。

> 反対の理由です。しかも、反対することによってかずのりさんから
> 楽しいフォローがいただけると言うオマケつき。

な、なんとー!あ、遊びだったのね。。。

> 「外見」からです。外見は重要です。

はい。「外見で人を判断するな」と言いますし(あれ?)。全く関係ないですが、
これと「怪しい人を見たら警察へ」は矛盾してると昔からよく思う。うん、こ
れだけ矛盾した世の中なんだし、Kernel#rand が何を受けとってもいーじゃん。
(最後の無駄な抵抗)

という事で、今のとこ、
  * Kernel#rand(xxx) ⇒ xxx は float も含む?min,max 指定はあり?
  * Array#random_get ⇒ 名前次第。(Array 以外に Range もあり?)
でしょうか。

------------------------------------------------------------------
九州大学大学院システム情報科学研究科 情報工学専攻 博士後期課程三年
      西 和則   ( e-mail: kazunori / swlab.csce.kyushu-u.ac.jp )
------------------------------------------------------------------