读Ruby for Rails的思考之Ruby的C扩展库

转载 2012年03月22日 23:15:52
Ruby除了用Ruby写的扩展库以外,还有许多C写的扩展库,比如socket编程库/系统日志功能库/数据库驱动 
这些库以.so或者.dll结尾,这也是我们require的时候不要使用.rb后缀的原因,比如 
Java代码  收藏代码
  1. require 'gdbm'  


Ruby开源项目、扩展库站点: 
Ruby Application Archive(RAA) 
RubyForge 

怎样写Ruby的C扩展库呢? 
我们来看看How to create a Ruby extension in C under 5 minutes 
该程序的前提是需要在linux/unix环境下 
MyTest/extconf.rb 
Java代码  收藏代码
  1. # Loads mkmf which is used to make makefiles for Ruby extensions  
  2. require 'mkmf'  
  3.   
  4. # Give it a name  
  5. extension_name = 'mytest'  
  6.   
  7. # The destination  
  8. dir_config(extension_name)  
  9.   
  10. # Do the work  
  11. create_makefile(extension_name)  

MyTest/MyTest.c 
Java代码  收藏代码
  1. // Include the Ruby headers and goodies  
  2. #include "ruby.h"  
  3.   
  4. // Defining a space for information and references about the module to be stored internally  
  5. VALUE MyTest = Qnil;  
  6.   
  7. // Prototype for the initialization method - Ruby calls this, not you  
  8. void Init_mytest();  
  9.   
  10. // Prototype for our method 'test1' - methods are prefixed by 'method_' here  
  11. VALUE method_test1(VALUE self);  
  12.   
  13. // The initialization method for this module  
  14. void Init_mytest() {  
  15.     MyTest = rb_define_module("MyTest");  
  16.     rb_define_method(MyTest, "test1", method_test1, 0);   
  17. }  
  18.   
  19. // Our 'test1' method.. it simply returns a value of '10' for now.  
  20. VALUE method_test1(VALUE self) {  
  21.     int x = 10;  
  22.     return INT2NUM(x);  
  23. }  

就这么简单,我们进入MyTest目录,运行 
Java代码  收藏代码
  1. ruby extconf.rb  

这会为我们创建Makefile,然后我们运行 
Java代码  收藏代码
  1. make  

这样我们的C扩展库就compile和build好了,让我们运行mytest.rb测试一下: 
Java代码  收藏代码
  1. # Load in the extension (on OS X this loads ./MyTest/mytest.bundle - unsure about Linux, possibly mytest.so)  
  2. require 'MyTest/mytest'  
  3.   
  4. # MyTest is now a module, so we need to include it  
  5. include MyTest  
  6.   
  7. # Call and print the result from the test1 method  
  8. puts test1  
  9.   
  10. # => 10  

该demo程序下载地址:extension-code.tar.gz

【Ruby】模块扩展方法介绍

当我们要扩展类的方法时,我们可以采取Mixin的方式将模块中的方法添加到类中,下面会对实现的几种方式进行详细介绍。...
  • sunset108
  • sunset108
  • 2015年10月18日 13:48
  • 1130

编写ruby扩展库

# Loads mkmf which is used to make makefiles for Ruby extensions require 'mkmf' # Give it a n...
  • frodo_sens
  • frodo_sens
  • 2014年07月23日 18:07
  • 1035

ruby 生成随机数 和 随机字符串

1,rand(999999) 生成 6 位随机数 2,puts rand(0xffffff) # 十六进制的 3,puts rand 生成 0-1 之间的任意数 4,  ...
  • wide288
  • wide288
  • 2014年07月11日 18:12
  • 7021

Rails宝典之第二式: 动态find_by方法

Rails宝典之第二式: 动态find_by方法  忘了声明了,这个系列主要是Rails入门教学。  今天Rails宝典教大家的是动态find_by方法,我们先看一段代码:  ...
  • blacksource
  • blacksource
  • 2011年12月25日 22:14
  • 2776

推荐 7 款最好的 Ruby on Rails 集成开发环境

Ruby 是个动态面向对象、通用的编程语言。它支持多种编程范式,包括面向功能和面向对象。同时它也包括一个动态类型系统和自动内存管理。 编辑器和集成开发环境(IDE)有些不同,编辑器是用来添加,编辑,...
  • kwame211
  • kwame211
  • 2017年08月05日 20:16
  • 290

Ruby on Rails 以及其与SSH框架的比较

一、Ruby on Rails 1. 什么是Rails Rails是Ruby on Rails的官方简称,非官方简称为RoR。在RubyOnRails的官网对Rails的定义是:Rails is...
  • Yarn_
  • Yarn_
  • 2017年03月30日 20:39
  • 676

一个使用Ruby on Rails开发LBS网站的简单实例

使用Ruby on Rails开发LBS网站 cheungmine 这几天一直在学习使用RoR(Ruby on Rails),想建立一个功能全面一点的LBS(Location Based Servic...
  • cheungmine
  • cheungmine
  • 2011年07月22日 00:30
  • 14911

ruby on rails入门系列--一个简单的HelloWorld程序

 安装了ruby和ruals后,我们就可以在命令窗口通过rails这个命令行工具来创建ruals应用程序,使用rails工具可以很多事情变得简单。 在E盘的根目录下创建一个RubyProject...
  • oec2003
  • oec2003
  • 2008年04月13日 09:31
  • 3842

Ruby On Rails--Action Controller(控制器)

Action Controller知识总览Action Controller Overview Action Controller is the C in MVC. After routing h...
  • liuk10
  • liuk10
  • 2016年04月07日 17:12
  • 529

什么是Ruby on Rails

过去的一年多时间里净忙着准备出国,学习法语,然后就是在做一些很杂的事情,一直没有花多少时间在编程上。我的博士论文课题是《社会语义WEB》,也看了不少关于本体论和语义WEB方面的论文。前几天看到一篇关于...
  • jlvince
  • jlvince
  • 2007年06月04日 13:05
  • 1516
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:读Ruby for Rails的思考之Ruby的C扩展库
举报原因:
原因补充:

(最多只允许输入30个字)