2012-01-31 16 views
3

RubyでインラインCを使用して再帰的な関数を書き直そうとしています。私は次のコードを使用してインラインCでこれを模倣しようとしていますRuby/Inline Cで未定義の引数を受け入れる

def each_entity(*types) 
     # Do something and recurse. 
    end 

:それはRubyで次のようになります。すなわち機能は、引数の未定義の数を受け入れる

VALUE each_entity_c(int argc, VALUE *argv) 
    { 
     // ... 
    } 

をしかし、これは得コンパイルエラー:

inline.rb:486:in `ruby2c': Unknown type "VALUE *" (ArgumentError) 

これはCでこれを行う正しい方法ですか?もしそうなら、このエラーの原因は何でしょうか?もしそうでなければ、どうやって行なわれますか?

+0

「VALUE」はどこで宣言しましたか? – asaelr

+0

Cの '...'はあなたが望むことをしませんか? – prelic

+0

@asaeler、VALUEはRuby Cコアで定義されています。 - "Cでは、すべてのRuby変数の型はVALUEです。これはRubyオブジェクトへのポインタか即値です"([Pickaxe](http:// rubycentral.com/pickaxe/ext_ruby.html))。 'VALUE each_entity_c(int test){...}'関数を定義することができますので、ここではVALUEが適切に定義されていると確信しています。 – user2398029

答えて

1

builder.cの代わりに、メソッドを定義するときにbuilder.c_raw(またはbuilder.c_raw_singleton)を試してください。 argsリストの末尾にVALUE selfを追加したいかもしれませんが、テストではそれを使うかしないかのようです。また、明示的に念のために、アリティを指定する価値があるかもしれません:

builder.cを使用して
inline do |builder| 

    builder.c_raw <<-EOS, :arity => -1 
    VALUE each_entity_c(int argc, VALUE *argv, VALUE self) 
    { 
     // ... 
    } 
    EOS 
end 

、Rubyのインラインは、cにこれらを変換することがパラメータとしてルビーVALUEタイプを受け入れるように機能を書き換えて、コードを追加しますあなたのオリジナルのタイプ。すでにVALUE引数が必要なコードを作成しているので、この変換を実行しないようにしてください。c_rawを使用する必要があります。

+0

魅力のように動作します。 – user2398029

0

私は間違っていない場合、あなたはあなたにこれをしたい:

VALUE each_entity_c(VALUE self, VALUE args) 
{ 
    // args is a Ruby array with all arguments 
} 
rb_define_method(class, "MyClass", each_entity_c, -2); 

C関数はすべての引数を持つRubyの配列を指定しています。

関連する問題