From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1997-08-15T15:02:16+09:00 Subject: [ruby-dev:133] Re: meta programming features けいじゅ@日本ラショナルです. In [ruby-dev :00128 ] the message: "[ruby-dev:128] Re: meta programming features ", on Aug/15 10:27(JST) matz@netlab.co.jp (Yukihiro Matsumoto) writes: >まつもと ゆきひろです >|実は, クラスは2種類のクラス変数を持てるんですね... >| >|* Foo::Var >|* Foo.type::Var >|です. 同じ名前だと前者が優先されているみたいですね? >ちゃいます.前者だけがクラスFooのクラス変数です.後者はクラ >スFooのメタクラスのクラス定数です.ですから後者は ええ. それは分かってますって. > Foo::Var これはそうですね. >の形式では参照できませんし.そもそもFooから参照できません. そんなことないみたいですよ. class Foo end class << Foo X = "Foo.type" def Foo.foo print X, "\n" end end Foo.foo Bar.foo ==== Foo.type とでます. と思いましたが... class Bar end class << Foo X = "Foo.type" def Bar.foo print X, "\n" end end Bar.foo ==== Foo.type となりますね... Foo.foo, Bar.fooがFooのメタクラスのコンテキストで定義 されたので定数が参照できていただけですね... >|# 何か話しが複雑になっているなあ... >なんかわざわざ複雑にしているような気もしますが…. (++;;; >さて,長いメールの内容は引用せずにコメントだけつけると: 順番を入れ替えますね. > * 特異クラスに定数を定義したり,特異クラスのインスタンス変 > 数にアクセスできても便利なことはない > >ことが気になります.もっとも特異クラスは定数とインスタンス変 >数に関して通常クラスと共有することにするという手もありますが. 全然便利でないといわれると困るんですが... 私が使っている例としては, 個別のインスタンスにクラスが関連している場合 に, 特異クラスの定数を使っています. 1.0ではクラス生成に名前(定数)が必 要なので, そうしないとクラス名を一意にする必要が出てきて, プログラムが 複雑になるからです. # 1.1では名前なしクラスができるのでこの問題はなくなるのかも知れません # が... でも, クラスは大文字でアクセスしたかったりして(^^;;; ただ, foo.evalの代わりに foo.type.evalやclass << fooを使えばいいので, Object#evalの仕様とはそれほど関係ないですが... > * foo.evalの仕様を public な使い方を想定して定義Bを提案し > ているようだが,関数的なevalの使い方を考えると定義Aの方 > が自然である(と松本が主張した)ことを考慮していない そうでしたね. 確かに eval "def func ..." と foo.eval "def func..." では, だいぶ雰囲気が違う... ただ, 1ついえることは, すでに 特異メソッドfoo.funcが定義されている時に foo.eval "def func .." が特異メソッドの再定義にならないのもおかしいと思いませんか? fooから見 たメソッドfuncの定義を行いたいわけですから... とはいえ, 常に特異メソッドや特異クラスの定数が定義されるのも, あまり嬉 しくないのも確かですね... 松本氏のいう通り, 基本は関数evalの動作が望ましいと思うようになったので すが... evalの動作をオプション引数で変えられるというのも変ですかねえ... eval "def foo.func..."で特異メソッドの定義はできるので, 少なくとも, す でにそういう名前の特異メソッドが定義されているかどうかを判断するメソッ ドは欲しいかなあ.. >|そうですか. それでは, さらに, MPF-APIのリクエストをします: > >なんか,これらは美しくない(趣味に合わない)ので,ちょっと検討 >してみます. そうですか... そんなに趣味が悪かったですか... >|ところで, 特異クラスが見えるようになると, そのサブクラスも作れるように >|なるんですかね? > >できていけない理由はないと思ったので,できます.禁止した方が >良いですか? そういうわけでもないんですけど... さらに, 特異クラスから新たにインスタンスを作ることもできるんですね. objの特異クラスはobjのシングルトンクラスになっているというイメージは間 違っているんですね... こうなってくると特異クラスって何だろう? って思いはじめてきました... 特 異クラスはあまり見せない方が良いのかも知れませんね... >|# なんだか, 話しが複雑だなあ... >なんかわざわざ複雑にしているような気もしますが….^^;;; ># ルールを積み重ねればなんだって複雑にできますよね うーん. rubyの柔軟性を表しているというか何というか... __ ..........................................石塚 圭樹@日本ラショナル... ----------------------------------->> e-mail: keiju@bc.mbn.or.jp <<---