Extender Ruby em C não é complicado. É claro, você deve ao menos ter o conhecimento básico da linguagem C.
Vamos criar uma extensão que retorna uma simples String.
Primeiramente criamos o diretório onde estará nossa extensão :
1
|
|
Crie um arquivo chamado 1up4dev.c e dentro dele inclua o header “ruby.h”
1
|
|
Tudo em Ruby relaciona-se com o tipo VALUE. Para nosso exemplo, vamos criar um VALUE m1up4dev representando um módulo.
1
|
|
E para representar uma classe, abaixo deste módulo, a qual chamaremos de Talker, criaremos uma VALUE cTalker:
1
|
|
Nossa classe Talker precisa fazer algo, vamos adicionar uma simples função que retorna uma String.
1 2 3 4 |
|
Na função say_yeah, VALUE self representa o objeto associado a função, sentence a String de retorno e a função rb_str_new2 converte o *char em uma Ruby String.
Para deixar esse código acessível no mundo Ruby, criaremos uma função chamada ‘Init_1up4dev’. Por convenção estas funções sempre começam com o prefixo ‘Init_’.
1 2 3 4 5 |
|
A função ‘rb_define_module’ define um módulo no topo da hierarquia. Algo como:
1 2 |
|
A função ‘rb_define_class_under’ define uma classe abaixo de um módulo ou outra classe. Isso irá gerar:
1 2 3 4 5 |
|
A função ‘rb_define_singleton_method’ é responsável por criar um método singleton em uma classe ou módulo, neste caso ele estará atrelado a class Talker.
Para rodar nosso exemplo, crie um arquivo chamado ‘extconf.rb’ contendo:
1 2 |
|
Executando o script, irá ser gerado um arquivo Makefile para executar o build da extensão.
1
|
|
Compile e instale a extensão:
1
|
|
Para ver o código funcionando basta digitar o código abaixo em um ‘irb’ ou algo do gênero :
1 2 3 4 |
|
YEAH YEAH!!