Ruby 最酷的功能之一就是使用 C/C++ 定義的應(yīng)用程序編程接口 (API) 擴(kuò)展它。Ruby 提供了 C 頭文件 ruby.h,它隨附提供了許多功能,可使用這些功能創(chuàng)建 Ruby 類(lèi)、模塊和更多內(nèi)容。除了頭文件,Ruby 還提供了其他幾個(gè)高層抽象來(lái)擴(kuò)展基于本地 ruby.h 構(gòu)建的 Ruby,本文要介紹的是 Ruby Interface for C++ Extensions 或 Rice。
創(chuàng)建 Ruby 擴(kuò)展
在進(jìn)行任何 Ruby 的 C API 或 Rice 擴(kuò)展前,我想明確地介紹一下創(chuàng)建擴(kuò)展的標(biāo)準(zhǔn)過(guò)程:
您具有一個(gè)或多個(gè) C/C++ 源代碼,可使用它們構(gòu)建共享庫(kù)。 如果您使用 Rice 創(chuàng)建擴(kuò)展,則需要將代碼鏈接到 libruby.a 和 librice.a。 將共享庫(kù)復(fù)制到同一文件夾,并將該文件夾作為 RUBYLIB 環(huán)境變量的一部分。 在 Interactive Ruby (irb) prompt/ruby 腳本中使用常見(jiàn)的基于 require 的加載。如果共享庫(kù)名為 rubytest.so,只需鍵入 require 'rubytest' 即可加載共享庫(kù)。假設(shè)頭文件 ruby.h 位于 /usr/lib/ruby/1.8/include 中,Rice 頭文件位于 /usr/local/include/rice/include 中,并且擴(kuò)展代碼位于文件 rubytest.cpp 中。 清單 1 顯示了如何編譯和加載代碼。
清單 1. 編譯和加載 Ruby 擴(kuò)展
bash# g++ -c rubytest.cpp –g –Wall -I/usr/lib/ruby/1.8/include / -I/usr/local/include/rice/includebash# g++ -shared –o rubytest.so rubytest.o -L/usr/lib/ruby/1.8/lib / -L/usr/local/lib/rice/lib -lruby –lrice –ldl -lpthreadbash# cp rubytest.so /opt/testbash# export RUBYLIB=$RUBYLIB:/opt/testbash# irbirb> require 'rubytest'=> true
Hello World 程序
現(xiàn)在,您已經(jīng)準(zhǔn)備好使用 Rice 創(chuàng)建自己的首個(gè) Hello World 程序。您使用名為 Test 的 Rice API 和名為 hello 的方法創(chuàng)建了一個(gè)類(lèi),用它來(lái)顯示字符串 "Hello, World!"。當(dāng) Ruby 解釋器加載擴(kuò)展時(shí),會(huì)調(diào)用函數(shù) Init_<shared library name>。對(duì)于 清單 1 的 rubytest 擴(kuò)展,此調(diào)用意味著 rubytest.cpp 已定義了函數(shù) Init_rubytest。Rice 支持您使用 API define_class 創(chuàng)建自己的類(lèi)。清單 2 顯示了相關(guān)代碼。
清單 2. 使用 Rice API 創(chuàng)建類(lèi)
#include "rice/Class.hpp"extern "C"void Init_rubytest( ) { Class tmp_ = define_class("Test");}
當(dāng)您在 irb 中編譯和加載清單 2 的代碼時(shí),應(yīng)得到 清單 3 所示的輸出。
清單 3. 測(cè)試使用 Rice 創(chuàng)建的類(lèi)
irb> require ‘rubytest'=> trueirb> a = Test.new=> #<Test:0x1084a3928>irb> a.methods=> ["inspect", "tap", "clone", "public_methods", "__send__", "instance_variable_defined?", "equal?", "freeze", …]
注意,有幾個(gè)預(yù)定義的類(lèi)方法可供使用,比如 inspect。出現(xiàn)這種情況是因?yàn)?,定義的 Test 類(lèi)隱式地衍生自 Object 類(lèi)(每個(gè) Ruby 類(lèi)都衍生自 Object;實(shí)際上,Ruby 中的所有內(nèi)容(包括數(shù)字)都是基類(lèi)為 Object 的對(duì)象)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注