2012-02-10 3 views
4

J'essaie de définir une classe dans un module avec l'API Ruby C. Cependant, la façon dont j'ai vu cela fait partout sur le net ne semble pas fonctionner pour moi. Plus précisément, le module de niveau supérieur est créé, mais la classe ne peut pas être trouvée dans le module. Voici mon fichier C:Définition de classes dans les modules avec l'API Ruby C

#include <ruby.h> 

static VALUE mTree; 
static VALUE cNode; 

VALUE hello_world(VALUE klass) 
{ 
    return rb_str_new2("hello world"); 
} 

void Init_tree() 
{ 
    mTree = rb_define_module("Tree"); 
    cNode = rb_define_class_under(mTree, "Node", rb_cObject); 
    rb_define_method(cNode, "hello_world", hello_world, 0); 
} 

Voici mon extconf.rb:

require 'mkmf' 
create_makefile('tree') 

Voici mon script de test:

require 'tree' 
puts Tree  # => Tree 
puts Tree::Node # => uninitialized constant Tree::Node (NameError) 

Quelqu'un peut-il aider?

Répondre

1

Ceci est étrange, votre exemple fonctionne pour moi:

→ ruby extconf.rb  
creating Makefile 
→ make   
linking shared-object tree.bundle 
→ irb 
>> $:<<'.' 
=> [...] 
>> require 'tree' 
=> true 
>> Tree 
=> Tree 
>> Tree.class 
=> Module 
>> Tree::Node.class 
=> Class 
>> Tree::Node.new.hello_world 
=> "hello world" 
+0

Quelle version de Ruby Courez-vous? J'utilise ruby ​​1.9.3dev (2011-09-23 révision 33323) [x86_64-darwin11.0.0]. – user2398029

+0

A travaillé pour moi aussi. Je suis sur Ruby 1.9.2-p0. – Brandan

+0

@louism ruby ​​1.9.3p0 (2011-10-30 révision 33570) [x86_64-darwin11.2.0] –

0

les opérations suivantes:

require_relative 'tree' 
Questions connexes