如何在 C 中检索从 ruby​​ 脚本传递的结构类型变量的结构成员?

发布于 2024-12-04 18:10:40 字数 788 浏览 1 评论 0原文

我已经实现了 Ruby C 扩展(即从 ruby​​ 脚本调用 C 函数) 以下是文件“cFile.c”中用 c 实现的函数

#include<stdio.h>
static VALUE cFunction(VALUE self, VALUE src)
{
   if(TYPE(str) == T_STRUCT)
   {
      printf(" variable str is of STRUCT type \n");
   }
   // here how can i get the members of structure variable "str" 

   return Qnil;
}
void Init_MyRuby()
{
    VALUE MRuby = rb_define_module("MyRuby");
    rb_define_singleton_method(MRuby, "cFunction", cFunction, 1);
} 

以下是通过传递结构类型变量调用 functon() 方法的 ruby​​ 脚本代码。 client.rb:

require 'cFile'
customer = Struct.new( "Customer", :name, :address, :zip )
joe = customer.new( "JoeSmith", "123 Maple, Anytown NC", 12345 )
MyRuby::cFunction(joe)

任何人都可以建议我如何在 cFunction() 中获取结构成员(即名称、地址等)吗? 提前致谢

I have implemented Ruby C extension(i.e. Invoking C function from ruby script)
Following is the function implemented in c from file "cFile.c"

#include<stdio.h>
static VALUE cFunction(VALUE self, VALUE src)
{
   if(TYPE(str) == T_STRUCT)
   {
      printf(" variable str is of STRUCT type \n");
   }
   // here how can i get the members of structure variable "str" 

   return Qnil;
}
void Init_MyRuby()
{
    VALUE MRuby = rb_define_module("MyRuby");
    rb_define_singleton_method(MRuby, "cFunction", cFunction, 1);
} 

Following is the code of ruby script that invokes functon() method by passing struct type variable. client.rb:

require 'cFile'
customer = Struct.new( "Customer", :name, :address, :zip )
joe = customer.new( "JoeSmith", "123 Maple, Anytown NC", 12345 )
MyRuby::cFunction(joe)

can any one suggest me how to get struct members(i.e. name, address etc) in cFunction()?
Thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

狼亦尘 2024-12-11 18:10:40

这是有效的(非鲁棒性):

puts(STR2CSTR(rb_funcall(str, rb_intern("name"), 0)));
puts(STR2CSTR(rb_funcall(str, rb_intern("address"), 0)));
printf("%i\n", NUM2INT(rb_funcall(str, rb_intern("zip"), 0)));

为了获得更好的性能,您应该在 C 代码中定义结构类型并
然后通过 Data_Wrap_Struct 将其扩展为 Ruby 对象,如中所述
镐,第 17 章

This works (non-robust):

puts(STR2CSTR(rb_funcall(str, rb_intern("name"), 0)));
puts(STR2CSTR(rb_funcall(str, rb_intern("address"), 0)));
printf("%i\n", NUM2INT(rb_funcall(str, rb_intern("zip"), 0)));

For better performance you should rather define the struct type in your C code and
then extend it to a Ruby object via Data_Wrap_Struct as outlined in
Pickaxe, chapter 17

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文