On Fri, 8 Dec 2006, Tim P. wrote:
{
…
}
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?
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