まつもと ゆきひろです

In message "[ruby-ext:01365] wrong argument type error"
    on 00/10/26, 渋川よしき <shibu / JA1YAX.gr.jp> writes:

|SDLのラッパーの拡張ライブラリを実験中なんですが、以下のようなエラーになり実行が
|止まってしまいます。開発・実行環境はBeOS R5 Personalです。
|
|test.rb:12:in `put': wrong argument type GX::Screen (expected Data) (TypeError)
|	from test.rb:12

こいつは Check_Type が出しています。んでもって、それを呼んで
るのは Data_Get_Struct です。つまり、これは GX::Screen オブ
ジェクトのタイプ(T_OBJECTとか)がT_DATAではないと文句してるん
ですね。若干エラーメッセージが分かりにくいですね。

ソースを見ないと具体的な問題点はわかりませんが、T_DATAが必要
なのに rb_obj_alloc() を呼んでたりするんじゃないでしょうか?
あるいは OBJSETUP() を呼んでるとか。

|で、何が分からないのかというと、Rubyの変数には型がないはずなのに、wrong argument
|typeというエラーメッセージが出る原因と意味です。Rubyインタプリタのソースも少し読
|んでみましたが、メソッドコール処理部分が見つからず、分かりませんでした。

Rubyの変数に型がないからといって、Rubyに型がないわけではあり
ません。個々のオブジェクトには型(クラス)があります。Rubyは実
行時にその型をチェックしています。

|もう一つ、
|RubyのクラスをC言語から作るときのことですが、スタートアップコードの流儀ってあり
|ますか?というのは、new、initializeどちらでやるべきか(まだinitializeしか試して
|ません)、特異メソッドにするか、ふつうのメソッドにするか(Rubyのソースでは両方あ
|った気がする)。なにか指針があれば教えてください。

initializeを使って下さい。特異メソッド(ってのはクラスメソッ
ドのことだと思いますが)については、使う必要があればどうぞ使っ
て下さい。

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