[英]Extending Ruby in C - converting arguments to c types
我该如何为红宝石做类似的事情。 我找不到将变量强制转换为对象的示例/文档。 例如
Local<Object> obj = args[0]->ToObject();
Local<Array> props = obj->GetPropertyNames();
我正在用ruby重新编写节点扩展。 任何形式的帮助都将非常有帮助。 谢谢
static Handle<Value> SendEmail(const Arguments& args)
{
HandleScope scope;
list<string> values;
Local<Object> obj = args[0]->ToObject();
Local<Array> props = obj->GetPropertyNames();
// Iterate through args[0], adding each element to our list
for(unsigned int i = 0; i < props->Length(); i++) {
String::AsciiValue val(obj->Get(i)->ToString());
values.push_front(string(*val));
}
// Display the values in the list for debugging purposes
for (list<string>::iterator it = values.begin(); it != values.end(); it++) {
cout << *it << endl;
}
return scope.Close(args.This());
}
当您将问题标记为C且您的代码示例是C ++时,我不确定是否能理解您的问题,但是无论哪种方式,如果您尝试扩展ruby,都需要将ruby值转换为C类型,如果计划使用C ++数据结构,则从C类型到C ++对象。
使用Ruby C Api:
#include "ruby.h"
//Define module my_module (this can be any name but it should be the name of your extension
VALUE MyModule = Qnil;
//Initialization prototype - required by ruby
void Init_MyModule();
//method prototype declarations - all methods must be prefaced by method_
VALUE method_get_some_ruby_value();
//actual method
VALUE get_some_ruby_value(VALUE self, VALUE some_value)
{
//If your value is a ruby string - the StringValue function from ruby will ensure
//that you get a string no matter what, even if the type being passed is not a string.
VALUE r_string_value = StringValue(some_value);
//Now we tell the Ruby API to give us the pointer to the ruby string
//value and we assign that to a native char * in C.
char *c_string_value = RSTRING_PTR(r_string_value);
//Now do something with the char * - for example, turn it into a C++ string
std::string str(c_string_value);
// ...do something useful here...
return Qnil; // If you want to return something back to ruby, you can return a VALUE.
}
//Ruby calls this to initialize your module in ruby
VALUE Init_MyModule()
{
//This defines your module in ruby
MyModule = rb_define_module("MyModule");
//This defines the method - the module it is in, the ruby method name, the actual method ruby will call, and the number of arguments this function is expected to take
rb_define_method(MyModule, "get_some_ruby_value", get_some_ruby_value, 1);
}
如果您想了解在Ruby / C / C ++之间来回传递结构的知识,则在开始尝试使用C ++对象之前,需要对Ruby和Ruby C API有透彻的了解。
这里有一些很好的资源可以帮助您入门:
http://silverhammermba.github.io/emberb/c/ http://java.ociweb.com/mark/NFJS/RubyCExtensions.pdf
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.