Ruby Language Votre première extension


Exemple

Les extensions C sont composées de deux pièces générales:

  1. Le code C lui-même.
  2. Le fichier de configuration d'extension.

Pour commencer avec votre première extension, placez-le dans un fichier nommé extconf.rb :

require 'mkmf'

create_makefile('hello_c')

Quelques points à souligner:

D'abord, le nom hello_c est ce que la sortie de votre extension compilée va être nommée. Ce sera ce que vous utiliserez en même temps que require .

Deuxièmement, le fichier extconf.rb peut en fait être nommé n'importe quoi, il est juste traditionnellement utilisé pour construire des gemmes avec du code natif, le fichier qui va en fait compiler l'extension est le Makefile généré lors de l'exécution de ruby extconf.rb . Le fichier .c par défaut généré compile tous les fichiers .c répertoire en cours.

Placez ce qui suit dans un fichier nommé hello.c et exécutez ruby extconf.rb && make

#include <stdio.h>
#include "ruby.h"

VALUE world(VALUE self) {
  printf("Hello World!\n");
  return Qnil;
}

// The initialization method for this module
void Init_hello_c() {
  VALUE HelloC = rb_define_module("HelloC");
  rb_define_singleton_method(HelloC, "world", world, 0);
}

Une ventilation du code:

Le nom Init_hello_c doit correspondre au nom défini dans votre fichier extconf.rb , sinon, lors du chargement dynamique de l'extension, Ruby ne pourra pas trouver le symbole permettant d'amorcer votre extension.

L'appel à rb_define_module est en rb_define_module créer un module Ruby nommé HelloC lequel nous allons HelloC nos fonctions C sous l'espace de noms.

Enfin, l'appel à rb_define_singleton_method crée une méthode de niveau module directement liée au module HelloC que nous pouvons appeler depuis ruby ​​avec HelloC.world .

Après avoir compilé l'extension avec l'appel à make nous pouvons exécuter le code dans notre extension C.

Allumez une console!

irb(main):001:0> require './hello_c'
=> true
irb(main):002:0> HelloC.world
Hello World!
=> nil