From: Ross Bamford Date: 2007-01-03T18:35:07+09:00 Subject: Re: How to do Hash#each_pair from C extension? On Wed, 03 Jan 2007 05:05:21 -0000, Bill Kelly wrote: > From: "Ross Bamford" >> On Fri, 29 Dec 2006 08:22:34 -0000, Bill Kelly wrote: >> > 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.) >> >> 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); >> } > > Thanks! Works great. > No problem :) > What I'm passing in as the second parameter isn't really a VALUE, > it's a pointer to the STL hash. As far as I could tell from grepping > the ruby sources, that *seems* to be legal (some ruby code passes > a NODE* for the second parameter, masquerading as a VALUE.) > > (Unless a NODE* really is a VALUE, in which case my passing in > a fake VALUE maybe isn't so good after all. I'm a little uncomfortable > not knowing for sure...) > No, that should be fine - ruby guarantees that VALUE casts to void*, and the second argument is purely for your use. Cheers, -- Ross Bamford - rosco@roscopeco.remove.co.uk