From: Ross Bamford Date: 2006-12-29T22:00:06+09:00 Subject: Re: How to do Hash#each_pair from C extension? On Fri, 29 Dec 2006 08:22:34 -0000, Bill Kelly wrote: > Hi, > > I'm trying to copy all the key/value pairs from a Ruby > hash into an STL hash. (BTW, I'm using Ruby 1.8.4 and > cannot change the ruby version easily.) > > It looks like rb_hash_foreach() in hash.c does exactly > what I want--allows me to pass in a function pointer, > which it will invoke yielding each key/value pair--but > it's declared static in hash.c. > > I looked at duplicating that functionality in my own > C code, but it requires "st.h" as well as constants > such as HASH_DELETED which are defined privately in > hash.c. > > Is there a different way I should be going about this? > Maybe try something like: static VALUE hsh_iterfunc(VALUE data_ary, VALUE hsh) { VALUE key = rb_ary_entry(data_ary, 0); VALUE value = rb_ary_entry(data_ary, 1); // do whatever, e.g. rb_funcall(rb_mKernel, rb_intern("puts"), 2, key, value); return data_ary; } VALUE ruby_iterhsh(VALUE self, VALUE hsh) { return rb_iterate(rb_each, hsh, hsh_iterfunc, hsh); } // ... later, rb_define_method(cSomeClass, "iterhsh", ruby_iterhsh, 1); Hope that helps, Ross -- Ross Bamford - rosco@roscopeco.remove.co.uk