[ruby-list:3057] Re: builtin class

From: matz@... (Yukihiro Matsumoto)
Date: 1997-05-30 08:59:17 UTC
List: ruby-list #3057
まつもと ゆきひろです

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からは直接アクセ
スできない機能を使うかどうかで決まると思います.

                                まつもと ゆきひろ /:|)

In This Thread