From: ptkwt@... (Phil Tomson) Date: 2005-08-04T02:06:07+09:00 Subject: Re: symbols in C extensions In article <7993c66305080305224adfe2ce@mail.gmail.com>, Brian Schr�der wrote: >On 03/08/05, Paolo Capriotti wrote: >> Is there a better (i.e. faster) way to create a symbol in a C >> extension than writing: rb_eval_string(":my_symbol")? >>=20 >> Thanks, >>=20 >> Paolo. >>=20 >>=20 > >From README.EXT: > > :Identifier > >You can get the symbol value from a string within C code by using > > rb_intern(const char *name) > >regards, > >Brian > > >--=20 >http://ruby.brian-schroeder.de/ > >Stringed instrument chords: http://chordlist.brian-schroeder.de/ > > Also, to speed things up in cases where you'll need to use the same symbols over and over you can do the rb_intern in the Init function of your extension, for example: #include "ruby.h" #include #include static int id_x; static int id_y; static int id_equal; .... a lot of snippage ... VALUE cACOMod; VALUE cACOPoint; VALUE cACOGraph; void Init_ACO_Ext() { printf("ACO_Ext initializing...\n"); cACOMod = rb_define_module("ACO"); cACOPoint = rb_define_class_under(cACOMod,"Point",rb_cObject); cACOGraph = rb_define_class_under(cACOMod,"Graph",rb_cObject); rb_define_alloc_func(cACOPoint, aco_point_alloc); rb_define_method(cACOPoint,"initialize",aco_point_init,2); rb_define_method(cACOPoint,"-",aco_point_diff,1); rb_define_method(cACOPoint,"==",aco_point_equal,1); rb_define_method(cACOPoint,"x",aco_point_getx,0); rb_define_method(cACOPoint,"y",aco_point_gety,0); //create your symbols ahead of time here: id_x = rb_intern("x"); id_y = rb_intern("y"); id_equal = rb_intern("=="); } Seems like it could help save some time if you use the symbols lots of times in your accessor functions for example. Phil