そのため、最近、Ruby 用の C 拡張機能を作成する必要がありました (パフォーマンスのため)。私は理解に問題を抱えていたのでVALUE
(そして今でもそうです)、Rubyソースを調べて見つけました:(typedef unsigned long VALUE;
Link to Source、しかし、それが行われる他のいくつかの「方法」があることに気付くでしょうが、それは本質的にlong
; 間違っていたら訂正してください)。そのため、これをさらに調査しているときに、次のような興味深いブログ投稿を見つけました。
「...場合によっては、データを指すのではなく、値オブジェクトがデータである可能性があります。」
私を混乱させるのは、Ruby から C に文字列を渡しRSTRING_PTR();
て (Ruby から C 関数に渡された) を使用し、それを使用しVALUE
て「デバッグ」しようとすると、 4strlen();
が返されることです。常に4.
コード例:
VALUE test(VALUE inp) {
unsigned char* c = RSTRING_PTR(inp);
//return rb_str_new2(c); //this returns some random gibberish
return INT2FIX(strlen(c));
}
この例では、文字列の長さとして常に 1 が返されます。
VALUE test(VALUE inp) {
unsigned char* c = (unsigned char*) inp;
//return rb_str_new2(c); // Always "\x03" in Ruby.
return INT2FIX(strlen(c));
}
ruby では、「モジュールを文字列に変換できません」という例外が表示されることがあります (または、これらの行に沿った何か、ただし、これを理解しようとしてコードをいじっていたので、今はエラーを再現できません私が試したときにエラーが発生しましたStringValuePtr();
[これが正確に何をするのか少しわかりません。ドキュメントには、渡さchar*
れたパラメーターが inp の ] に変更されると書かれています):
VALUE test(VALUE inp) {
StringValuePtr(inp);
return rb_str_new2((char*)inp); //Without the cast, I would get compiler warnings
}
したがって、問題の Ruby コードは次のとおりです。MyMod::test("blahblablah")
編集: いくつかのタイプミスを修正し、投稿を少し更新しました。
質問
- 正確には何が
VALUE imp
保持されますか?オブジェクト/値へのポインタ? 価値そのもの? - 値自体を保持している場合:いつそれを行い、それを確認する方法はありますか?
- 実際に値にアクセスするにはどうすればよいですか (値以外のほとんどすべてにアクセスしているように見えるため) 。
PS: C についての私の理解は、実際には最善ではありませんが、進行中の作業です。また、追加の説明については、コード スニペットのコメントをお読みください (役立つ場合)。
ありがとう!