see ext/dbm/dbm.c
at a glance at this
492 static VALUE
493 fdbm_replace(obj, other)
494 VALUE obj, other;
495 {
496 fdbm_clear(obj);
497 rb_iterate(each_pair, other, update_i, obj);
498 return obj;
499 }
this
463 static VALUE
464 each_pair(obj)
465 VALUE obj;
466 {
467 return rb_funcall(obj, rb_intern("each_pair"), 0, 0);
468 }
this
472 static VALUE
473 update_i(pair, dbm)
474 VALUE pair, dbm;
475 {
476 Check_Type(pair, T_ARRAY);
477 if (RARRAY(pair)->len < 2) {
478 rb_raise(rb_eArgError, "pair must be [key, value]");
479 }
480 fdbm_store(dbm, RARRAY(pair)->ptr[0], RARRAY(pair)->ptr[1]);
481 return Qnil;
482 }
and this
795 rb_define_method(rb_cDBM,"replace", fdbm_replace, 1);
i think we can translate
497 rb_iterate(each_pair, other, update_i, obj);
which would look like
dbm.replace other
in ruby
as
iterate over 'other' via the method 'each_pair' and, for each yielded pair,
call the method 'update_i' on 'obj'.
at least that what i'm guessing - i have __no__ idea 
regards.
-a
···
On Fri, 8 Dec 2006, Tim Pease wrote:
If anyone out there has used the "rb_iterate" function in a Ruby C
extension, could you please post a simple explanation of (a) how to
use the function and (b) an explanation of the method signature?
From eval.c ...
VALUE
rb_iterate(it_proc, data1, bl_proc, data2)
VALUE (*it_proc) _((VALUE)), (*bl_proc)(ANYARGS);
VALUE data1, data2;
{
...
}
I understand that "it_proc" and "bl_proc" are function pointers and
"data1" and "data2" are the arguments that are passed to each
function, respectively. What I don't understand is how all these work
together to iterate over a collection.
Pointers, tips, tutorials, explanations?
--
if you want others to be happy, practice compassion.
if you want to be happy, practice compassion. -- the dalai lama