Ruby Language Écrire en ligne C - RubyInLine


Exemple

RubyInline est un framework qui vous permet d'intégrer d'autres langages dans votre code Ruby. Il définit la méthode inline du module #, qui renvoie un objet générateur. Vous transmettez au générateur une chaîne contenant du code écrit dans une langue autre que Ruby, et le générateur la transforme en quelque chose que vous pouvez appeler depuis Ruby.

Lorsqu'il est donné du code C ou C ++ (les deux langages pris en charge dans l'installation par défaut de RubyInline), les objets du générateur écrivent une petite extension sur le disque, la compilent et la chargent. Vous n'avez pas à gérer la compilation vous-même, mais vous pouvez voir le code généré et les extensions compilées dans le sous-répertoire .ruby_inline de votre répertoire personnel.

Intégrez le code C directement dans votre programme Ruby:

  • RubyInline (disponible en tant que gem rubyinline ) crée automatiquement une extension

RubyInline ne fonctionnera pas depuis 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

La fonction C copy_file existe maintenant comme méthode d'instance de Copier :

open('source.txt', 'w') { |f| f << 'Some text.' }
Copier.new.copy_file('source.txt', 'dest.txt')
puts open('dest.txt') { |f| f.read }