編寫內聯 C - RubyInLine
RubyInline 是一個框架,允許你在 Ruby 程式碼中嵌入其他語言。它定義了 Module#inline 方法,該方法返回一個構建器物件。你將構建器傳遞給包含用 Ruby 之外的語言編寫的程式碼的字串,然後構建器將其轉換為可以從 Ruby 呼叫的內容。
當給定 C 或 C++程式碼(預設 RubyInline 安裝中支援的兩種語言)時,構建器物件會將一個小副檔名寫入磁碟,編譯並載入它。你不必自己處理編譯,但可以在主目錄的 .ruby_inline 子目錄中看到生成的程式碼和已編譯的擴充套件。
在 Ruby 程式中嵌入 C 程式碼:
- RubyInline(作為 rubyinline gem 提供)自動建立擴充套件
RubyInline 不能在 irb 中工作
#!/usr/bin/ruby -w
# copy.rb
require 'rubygems'
require 'inline'
class Copier
inline do |builder|
builder.c <<END
void copy_file(const char *source, const char *dest)
{
FILE *source_f = fopen(source, "r");
if (!source_f)
{
rb_raise(rb_eIOError, "Could not open source : '%s'", source);
}
FILE *dest_f = fopen(dest, "w+");
if (!dest_f)
{
rb_raise(rb_eIOError, "Could not open destination : '%s'", dest);
}
char buffer[1024];
int nread = fread(buffer, 1, 1024, source_f);
while (nread > 0)
{
fwrite(buffer, 1, nread, dest_f);
nread = fread(buffer, 1, 1024, source_f);
}
}
END
end
end
C 函式 copy_file
現在作為 Copier
的例項方法存在:
open('source.txt', 'w') { |f| f << 'Some text.' }
Copier.new.copy_file('source.txt', 'dest.txt')
puts open('dest.txt') { |f| f.read }