新井です。

rubyist から dev に移ります。

無名なクラスやモジュールの名前決定の仕様に関してです。

In message "[rubyist:0639] Re:無名クラス/モジュール"
  on 06 Jun 2001 08:55:20 +0900,
  matz / zetabits.com (Yukihiro Matsumoto) wrote:
> まつもと ゆきひろです
> 
> In message "[rubyist:0637] Re:無名クラス/モジュール"
>     on 01/06/06, Koji Arai <JCA02266 / nifty.ne.jp> writes:
> 
> |そもそも、なんでこういう仕様なのかが疑問だったりしますが、最初の代入時に
> |名前を決定すると何かマズイことがあるのでしょうか?
> 
> 代入という行為をフックしたくないからです。

うーん、でも多重代入などでも仕掛けは色々あるし、
# 意味が違うかな?
グローバル変数だと処理のフック(代入が代入以上の意味を持つ)を
許してますよね?
# グローバル変数は特殊用途だから許容しているとも言える?

単純に利用者の立場として「代入時にクラス名決定」は以下の点で納得できる
  o 単純で理解しやすい。
  o 代入に仕掛けがあるのではなくクラスの仕様に仕掛けがあるように思える
  o 代入の動作自体に影響はない
のですが、今の仕様は些細な曖昧さを感じます。些細な事だけにあ
まり言及したくない気持があります(だからこの件の場合、文案3 
を考えてしまうのだな)

実例で書くと

  Foo = Struct.new(:a, :b, :c)

としたとき、これを書いた人は当然クラス名が Foo であるクラスを
定義したつもりになってるのですが実はそうじゃないかも知れない。
確実にクラス名を固定するには

  Foo = Struct.new(:a, :b, :c)
  Foo.name

としないといけないわけですよね?これはやだなあ。

普通、他の定数に再代入する事はあまりないだろうという点で些細
ですが、だからといって必ずしもそうじゃない(後者のようにしな
いと確定しない)のは嫌です。この仕様を知らなければ変に不安に
ならずに幸せな気持になれます。

ということは代入時にクラス名を決定すべきなのだと思いますが、
いかがなものでしょう?

--
新井康司 (Koji Arai)