編寫內聯 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 }