From: Charles Mills Date: 2004-06-23T04:27:08+09:00 Subject: Re: passing a block in an extension On Jun 22, 2004, at 11:54 AM, Jeff Mitchell wrote: > --- Charles Mills wrote: >> I am trying to write a function in C which calls a Ruby function using >> the block it was passed when called from Ruby. Below is broken way to >> do it, but it explains the idea better. >> >> $ irb >> irb(main):001:0> require 'test' >> => true >> irb> my_method do |r| >> irb* puts r >> irb> end >> LocalJumpError: no block given >> from (irb):4:in `each' >> from (irb):4:in `my_method' >> from (irb):4 >> irb> exit >> $ more test.c >> #include >> #include >> >> VALUE >> my_method(VALUE kernel) >> { >> VALUE ary = rb_ary_new(); >> VALUE str1 = rb_str_new2("hey"); >> VALUE str2 = rb_str_new2("hey you"); >> rb_ary_push(ary, str1); >> rb_ary_push(ary, str2); >> >> //return rb_funcall(ary, rb_intern("each"), 0, 0); > > return rb_yield(ary); > Not exactly what I am after. I was hoping to be able to use the block passed to "my_method" as a parameter to a call when calling a method (in this case "each") on a Ruby object (in this case ary) created in "my_method". >> } >> >> void Init_test() >> { >> rb_define_module_function(rb_mKernel, "my_method", my_method, >> 0); >> } > > > > > > __________________________________ > Do you Yahoo!? > New and Improved Yahoo! Mail - 100MB free storage! > http://promotions.yahoo.com/new_mail >