まつもと ゆきひろです
In message "[ruby-list:3056] builtin class"
on 97/05/30, toyofuku / juice.or.jp <toyofuku / juice.or.jp> writes:
| 豊福@パパイヤです。
|
| ruby 埋め込みのアプリケーションで新しいクラスを
|組込で作るかユーザ定義で作るかについて教えて下さい。
| 組込クラスのサブクラスには何らかの制限があったと
|思うのですが、実用上どのくらい問題になる(ならない)
|ものでしょうか。
まずrubyのクラスには種類がありません.rubyで定義してもCで定
義しても同じクラスが出来ます.種類があるのはオブジェクトです.
オブジェクトには2種類あります.
組込みオブジェクト
ruby.hで構造の定義されている通常のオブジェクトとはことな
る構造を持つオブジェクト.このオブジェクトはインスタンス
変数を持てないしなど制限がある.
通常オブジェクト
普通のオブジェクト
組込みオブジェクトのクラスは(普通のクラスですけど),組込みオ
ブジェクトの制限からメソッドに細工がしてある場合があります
(後述).
組込みオブジェクトは簡単には追加できません.拡張モジュールを
書く人はDataという組込みオブジェクトを使ってCの構造体をラッ
プするのが普通です.
| ところで、まずは組込クラスをいろいろさわってみよう
|と適当に
| x = Fixnum.new(5)
|と試したところ
| ERR: undefined method `new' for Fixnum(Class)
|と怒られました。
Numericのサブクラスはnewを知りません.undefしてあります.
| クラスは皆 new を知っている(少なくとも先祖の
|誰かは知っている)と思っていたのですが、どこが
|おかしいのでしょうか。
全てのクラスの大本のクラスであるClassは(声に出すと変な感じ),
newというメソッドを定義していますから,普通だったらnewを知っ
ているんですが,Numericのそれぞれのサブクラスなどではわざわ
ざundefしています.
# でもString.newはあるんだから,あっても良かったのかなあ.
rubyの場合メソッドのundefという機能があるので,スーパークラ
スのメソッドをサブクラスが必ず持っているとは限らないのです.
ちなみにrubyではnewはC++でいうところのコピーコンストラクタの
機能を持つとは限りませんので,
SomeClass.new(obj)
でそのオブジェクトのコピーが出来るとは限りません.
さてもともとの質問に返ると,クラスをCで定義すべきかrubyで定
義すべきかはメソッドをなにで記述するかによると思います.メソッ
ドが全部rubyで記述されるクラスならrubyで定義した方が良いと思
いますし,メソッドがCで記述されるクラスならCで定義したら良い
と思います.
メソッドをなにで記述するかは,実行効率やrubyからは直接アクセ
スできない機能を使うかどうかで決まると思います.
まつもと ゆきひろ /:|)