我使用 C++ 类创建了一个示例 ruby 扩展。当我没有解析该值时它工作正常。但是当我解析参数时它显示错误。这是我的代码。
C++ 头文件
#ifndef CIRCLE_H_
#define CIRCLE_H_
class Circle {
public:
Circle(float radius):_radius(radius) {}
float getArea() { return 3.14159 * _radius * _radius; }
private:
float _radius;
};
CPP 文件。
#include<ruby.h>
#include"Circle.h"
VALUE method_test(VALUE y){
double x= NUM2DBL(y);
Circle *cir= new Circle(x);
return DBL2NUM(cir->getArea());
}
extern "C" void Init_Test(){
VALUE lemon = rb_define_module("Test");
rb_define_method(lemon, "test", (VALUE(*)(ANYARGS))method_test,1);
}
扩展配置文件
require 'mkmf'
have_library( 'stdc++' );
$CFLAGS << " -Wall"
create_makefile( 'Test' );
run.rb
require 'rubygems'
require 'Test'
include Test
puts test(7)
当我执行 run.rb 时,它显示错误。
run.rb:7:in `test': can't convert Object into Integer (TypeError)
from run.rb:7:in `<main>'
请帮我解决这个问题。谢谢。
The line
VALUE method_test(VALUE y) {
应该
VALUE method_test(VALUE self, VALUE y) {
错误消息是由NUM2INT(y)
因为y
是根Object
代码中脚本的原样。根对象是您所获得的,因为您在脚本的顶层混合了模块。如果您混入另一个类,您将获得该类的一个实例。
所有本机扩展方法都应该采用self
参数(如果您有固定数量的参数,则为第一个参数),这是调用它们的上下文(aModule
, Class
或一个实例Class
)。这就是你如何得到foo
当您拨打电话时进入分机foo.test
。当 Ruby 和 C++ 自动执行此操作时,这可能看起来很奇怪(self
在红宝石中,以及this
在 C++ 中):但是有必要self
出现为 param 因为 Ruby 内部 API 是用 C 编写的,它不直接支持 OO - 相反,Ruby API 定义在ruby.h
期望您编写和使用将对当前对象的引用作为参数之一的 C 函数。
此外,您正在拨打Circle( int radius )
- 不存在(尽管编译器可能是善意的并且强制的)x
自动为您服务)。你可能想使用double
贯穿始终的变量和使用NUM2DBL(y)
and DBL2NUM( cir->getArea() )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)