创建 ruby​​ C++ 扩展

2023-11-27

我使用 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(使用前将#替换为@)

创建 ruby​​ C++ 扩展 的相关文章

随机推荐

  • 如何查看表的日志数据绿屏DB2

    如何查看指定表中的日志数据 我想查看某个表在指定时间范围内发生了什么情况 我使用以下命令获取了表上的信息 DSPFD 文件 P6PRDBDB00 P6OIDPF 获得了日志名称和库 但我不知道如何查看对象 P6OIDPF I did go
  • hive 中的映射类型变量

    我在尝试在配置单元中定义地图类型时遇到问题 根据蜂巢手册肯定有地图类型 不幸的是没有任何关于如何使用它的示例 假设 我有一个包含以下列的表 用户 Name Ph CategoryName 此 CategoryName 列具有一组特定的值 现
  • 为什么在 STL 映射中用作值的类需要...中的默认构造函数?

    下面是用作映射中的值的类 class Book int m nId public Book lt Why is this required Book int id m nId id main 内部 map lt int Book gt ma
  • Android 风格传承

    事情是这样的 在我的 Styles xml 中 我有一个通用样式 并且一个样式继承了另一个样式 如下所示
  • com.thoughtworks.xstream.mapper.CannotResolveClassException

    这是我第一次尝试 XStream 但是当我尝试解析我的 xml 文件时 我得到了这个异常 Exception in thread main com thoughtworks xstream mapper CannotResolveClass
  • 如何在Java中获取Windows用户名?

    所以我想做的是让我的Java找到Windows登录的用户名 所以当我说这样的方法时 它会返回用户名 就像我在名为Noah的用户中使用它一样 java会返回 Noah 如果我在用户 Amanda 上 Java 将返回 Amanda 我该怎么做
  • 如何自定义 Spinner 下拉视图

    是否可以自定义微调器下拉视图 默认微调器下拉视图具有适配器视图 我想更改该视图以拥有自己的文本视图或类似的东西 在您的类中添加此内部类并根据需要进行修改 public class MyAdapter extends ArrayAdapter
  • 如何检查访问者是否使用最新版本的浏览器?

    是否有一种简单且自动的方法来检查我的网站 用 asp net 编写 的访问者是否使用最新版本的浏览器 这将允许我显示一条消息 通知他们他们正在运行旧版本并且他们可能想要升级 我的网站在大多数浏览器上进行了测试 但我不测试旧版本 例如 Int
  • 抓取视频的第一帧 - 缩略图分辨率 - iPhone

    我想在我的应用程序中显示视频的 静态 第一帧作为预览 我已阅读此线程并了解我可以使用缩略图 从 iPhone SDK 中的视频 URL 或数据获取缩略图 我有两个问题 1 缩略图的分辨率是多少 我希望将预览设为 4 3 格式 并想知道如果放
  • Angular 模块私有成员

    在 AngularJS 中 是否可以创建私有控制器或服务 这些控制器或服务可以在定义它们的模块中使用 但不能由它们注入的另一个模块使用 例如 是否可以将 PrivateController 设为子模块私有 angular module Ch
  • pandas:从 pandas 表中的日期中减去当前日期

    我正在尝试计算今天与由历史数据组成的 pandas 数据之间的天数差异 下面是预期的代码 df diff pd to datetime df date pd datetime now date 但是 它会产生以下错误 类型错误 不支持的操作
  • 如何使用jquery使图像沿圆形路径移动?

    在这里 我试图使图像沿圆形路径移动 但它没有沿圆形路径移动 我已经尝试过这样的缓慢移动图片 CSS friends position absolute Markup img src http jsfiddle net img logo pn
  • 如何让“git log”显示“svn log -v”等文件名

    SVN 的日志有一个 v 模式 它输出每次提交中更改的文件的文件名 如下所示 jes5199 svn log v r1 jes5199 2007 01 03 14 39 41 0800 Wed 03 Jan 2007 1 line Chan
  • 我可以在 iOS 的 Core Text 中使用 NSAttributedString 吗?

    我正在尝试弄清楚如何获取 NSAttributedString 并在 iPad 上的 Core Text 中使用它 我观看了 WWDC 视频 110 之一 其中有幻灯片 但没有源代码 它描述了如何创建 NSAttributedString
  • 如何在 PHP 中使用 Word Net

    如何在 php 中使用 word Net 是否有任何接口或任何类 我需要使用 wordnet 来实现我的词典目的 在下载页面上可以使用命令行工具进行下载 如果你启用了 exec 你可以从 php 使用它 http wordnet princ
  • 与 Qt 静态链接的应用程序出现错误:无法加载平台插件“windows”

    我已经在 Windows 7 x64 下的 VS 2010 中静态构建了 Qt 5 0 1 配置参数是 configure debug and release opensource confirm license platform win3
  • 使用 Jackson JSON 视图而不注释原始 bean 类

    有什么方法可以使用 Jackson JSON Views 或类似的东西 而不必注释原始 bean 类 我正在寻找某种运行时 动态配置来让我做类似的事情 我的豆子是一个 Entity打包在可由多个项目共享的 JAR 中 由于使用项目中的 UI
  • pandas sort_values 函数中 axis=1 的含义是什么? [复制]

    这个问题在这里已经有答案了 我有以下代码片段 df pd DataFrame col1 A A B np nan D C col2 2 1 9 8 7 4 col3 0 1 9 4 2 3 print df sorted df sort v
  • 如何使用 Delphi 7 将文本文件从 ANSI 转换为 UTF-8?

    我用 Delphi 7 编写了一个程序来搜索 srt硬盘上的文件 该程序在备忘录中列出这些文件的路径和名称 现在我需要将这些文件从 ANSI 转换为 UTF 8 但我还没有成功 Utf8Encode 函数采用 WideString 字符串作
  • 创建 ruby​​ C++ 扩展

    我使用 C 类创建了一个示例 ruby 扩展 当我没有解析该值时它工作正常 但是当我解析参数时它显示错误 这是我的代码 C 头文件 ifndef CIRCLE H define CIRCLE H class Circle public Ci