Ruby使用C++扩展实例(含C++扩展代码示例)

早年写过用C++ + SWIG写Ruby插件的文,但实际中还是以原生C++写Ruby扩展,因为也相当简单。但长久没用还是会忘记,不得不翻以前的老代码回忆,写下这篇博文,若下次再忘记,也不至于去翻仓库。

建立 extconf.rb


代码如下:

require 'mkmf'

$libs = '-lstdc++'
create_makefile 'foo'

建立 foo.cc


代码如下:

#include <ruby.h>

VALUE plus(VALUE self, VALUE va, VALUE vb)
{
 int a = NUM2INT(va);
 int b = NUM2INT(vb);

return INT2NUM(a+b);
}

extern "C" void Init_foo()
{
 VALUE foo = rb_define_module("Foo");
 rb_define_module_function(foo, "plus", RUBY_METHOD_FUNC(plus), 2);
}

生成扩展 foo.so


代码如下:

$ ruby extconf.rb
$ make
# 如果要安装至site-ruby
$ make site-install

测试文件 test.rb


代码如下:

require 'foo.so'

puts Foo.plus(3,4)
$ ruby test.rb
7

(0)

相关推荐

  • jQuery EasyUI API 中文帮助文档和扩展实例

    下载地址:jQuery EasyUI API 中文帮助文档 1.validatebox验证和提示框扩展: //弹框 $.extend({ show_alert: function (strTitle, strMsg) { $.messager.alert(strTitle, strMsg); } }); //扩展validatebox,添加验证 $.extend($.fn.validatebox.defaults.rules, { eqPwd: { validator: function (va

  • es6 字符串String的扩展(实例讲解)

    新特性:模板字符串 传统字符串 let name = "Jacky"; let occupation = "doctor"; //传统字符串拼接 let str = "He is "+ name +",he is a "+ occupation; es6简洁的字符串拼接 let name = "Jacky"; let occupation = "doctor"; //模板字符串拼接 le

  • ES6字符串的扩展实例

    本节我们来学习 ES6 中字符串类型的扩展,包括一些字符串对象的新增方法的使用等. 字符的 Unicode 表示法 ES6 加强了对 Unicode 的支持,JavaScript 中可以采用 \\uxxx 形式表示一个字符,其中 xxxx 表示字符的码点.例如: console.log("\u0075"); // u 但是这种表示法只限于码点在 \\u0000~\\uFFFF 之间的字符.超出这个范围的字符,必须用两个双字节的形式表示. console.log("\uD842

  • ECMAScript 6数组的扩展实例详解

    目录 扩展运算符 Array.from() Array.of() 数组实例的 copyWithin() 数组实例的 find() 和 findIndex() 数组实例的 fill() 数组实例的 includes() 扩展运算符 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) // 1 2 3 console.log(1, ...[2, 3, 4], 5) // 1 2 3 4

  • ECMAScript 6数值扩展实例详解

    目录 一.数值的扩展 Number.isFinite(), Number.isNaN() Number.parseInt(), Number.parseFloat() Number.isInteger() 一.数值的扩展 Number.isFinite(), Number.isNaN() ES6 在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法. Number.isFinite()用来检查一个数值是否为有限的(finite),即不是Infin

  • element plus的样式修改和扩展实例

    目录 一.用户故事 二.需求分析 三.需求实现 一.用户故事 我们开发了一个业务组件库.业务组件库是需要基于公司内部的一个UI组件库.而公司的UI组件库又出“基于”element ui的. 公司的UI组件库是对element ui的主题色进行了修改,并且也对于一些组件进行了扩展.可惜的是,由于他们的版本是vu2版本.我们的业务组件库是vue3的element plus的版本. 二.需求分析 实现形式的考虑 续期的扩展 三.需求实现 主题色的改变 组件样式的扩展 element plus对于各种函

  • Yii安装EClientScript插件扩展实现css,js文件代码压缩合并加载功能

    本文实例讲述了Yii安装EClientScript插件扩展实现css,js文件代码压缩合并加载功能.分享给大家供大家参考,具体如下: 扩展插件下载地址,解压后复制到/protected/vendor/ https://github.com/muayyad-alsadi/yii-EClientScript main配置文件配置插件,components里面增加 //js,css代码压缩,合并 'clientScript' => array( 'class' => 'application.ven

  • 用js实现每隔一秒刷新时间的实例(含年月日时分秒)

    原理:使用定时器,即setInterval(fn,i),每隔i秒执行fn. 下面给出具体的代码 1.代码如下: <span style="font-size:14px;"><!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>用js实现每隔一秒刷新时间(含年月日时分秒)</tit

  • 将目录下的文件按扩展名分类的bat代码

    其实就是利用强大的for命令实现 实现代码: 复制代码 代码如下: for %%i in (*) do (md %%~ximove *%%~xi %%~xi)pause %~xI          - 仅将 %I 扩展到一个文件扩展名只打印文件的扩展名FOR /F "delims==" %%i IN ('dir /b') DO @echo    %%~xipause

  • 让IIS支持任意扩展名和未知扩展名的下载(下载站设置)

    如果下载空间里面有asp,php文件不建议这样设置,如果这样设置了又不想让asp,php文件被别人下载可以使用. 第一步: 取消网站执行权限 2.为防止asp,php文件被下载,没有就不需要设置 让IIS支持任意扩展名和未知扩展名的下载 1. 打开 IIS Microsoft 管理控制台 (MMC),右键单击本地计算机名称,然后单击"属性". 2. 单击"MIME 类型". 3. 单击"新建". 4. 在"扩展名"框中,键入星

随机推荐