At Fri, 5 Apr 2002 18:24:15 +0900,
Minero Aoki wrote:
> かつて when *list という表現がなかったころ、when に配列を
> 置いたときに include? になってしまうのが嫌、という声があり
> 消滅したのだと記憶しています。
> (その代わりに when *list ができたのでした)

 なるほど。

 しかし、 Range, Regexp, Module の === を見ても適合とか包含という
意味で === は使われていると思うのです。String だと include? になら
ないから?でも String はスカラ、 Array はコンテナと見れば不思議は
ないような。

> また Proc に関して
> 
> > 	class Proc
> > 	  def ===(o)
> > 	    call(o)
> 
> これは使われたときに意味が明確でないですし、全ての Proc が
> 真偽判定に使われるのではないので全ての Proc に定義するのは

 これは理解できます。

 Proc も置きたいと思ったのは、 VB には

	Select Case x
	Case 0 To 5
	  ...
	Case 6, 8
	Case Is < 0
	  ...
	End Select

というのがあるのですが、 Ruby だと同様のケースで if と case の
組合せや書き換えで悩むので、なんとかしたいということでした。

 つまり、同じ x での場合分けなのに

	case x
	when 0..5
	  ...
	when 6, 8
	  ...
	else
	  if x < 0
	    ..
	  else
	    ..
	  end
	end

とか

	if x < 0
	  ..
	else
	  case x
	  when a, b
	    ...
	  when c
	    ...
	  else
	    ..
	  end
	end

のように階層が変わるのが嫌だなあと思うのです。

 何かきれいな仕様はないかしら。。

 when がブロックを受けるとか、 whenif を導入するなんてことを
やると、構文のアイデンティティがめちゃくちゃになってしまうし。


 ちなみに、 Array と Hash については Perl6 の when を見て欲しく
なりました。 ;) (前々からぼんやりと欲しいとは思っていましたが)

> よくないと思います。こういうことがしたい場合には特異メソッドを
> 使うということでどうでしょ。
> 
>   cond = lambda { .... }
>   cond.instance_eval { alias === call }

 これはみな(実行上、または書く際の)効率の問題なのです。確かに

	case x
	when *array
	  ...
	when *hash.keys
	  ...
	when proc {|x| x > 0}.instance_eval {alias === call}
	  ...
	end

と書けます。でも、この上長さや非効率が、(有効に使われていない)
=== をうまく定義してやることで解決するのなら、そうしてみたいと。

	case x
	when array
	  ...
	when hash
	  ...
	when proc {|x| x > 0}
	  ...
	end

が果たして自明なのか、という疑問は確かにありますが。

-- 
                     /
                    /__  __            Akinori.org / MUSHA.org
                   / )  )  ) )  /     FreeBSD.org / Ruby-lang.org
Akinori MUSHA aka / (_ /  ( (__(  @ iDaemons.org / and.or.jp

"Somewhere out of a memory.. of lighted streets on quiet nights.."