From: matz@... (Yukihiro Matsumoto) Date: 1997-05-30T17:59:17+09:00 Subject: [ruby-list:3057] Re: builtin class まつもと ゆきひろです In message "[ruby-list:3056] builtin class" on 97/05/30, 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からは直接アクセ スできない機能を使うかどうかで決まると思います. まつもと ゆきひろ /:|)