Passing a block in an extension

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

my_method do |r|

irb* puts r

end

LocalJumpError: no block given
         from (irb):4:in `each'
         from (irb):4:in `my_method'
         from (irb):4

exit

$ more test.c
#include <ruby.h>
#include <intern.h>

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);
}

void Init_test()
{
         rb_define_module_function(rb_mKernel, "my_method", my_method, 0);
}

···

----------------------
Charlie

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
> my_method do |r|
irb* puts r
> end
LocalJumpError: no block given
         from (irb):4:in `each'
         from (irb):4:in `my_method'
         from (irb):4
> exit
$ more test.c
#include <ruby.h>
#include <intern.h>

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);

···

--- Charles Mills <cmills@freeshell.org> wrote:

}

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

Look at rb_scan_args in http://www.rubycentral.com/book/ext_ruby.html\.

VALUE my_method(int argc, VALUE *argv, VALUE self)
{
    VALUE block = Qnil;
    VALUE ary = rb_ary_new();
    VALUE str1 = rb_str_new2("hey");
    VALUE str2 = rb_str_new2("hey you");

    rb_scan_args(argc, argv, "&", &block);

    rb_ary_push(ary, str1);
    rb_ary_push(ary, str2);

    return rb_funcall(ary, rb_intern("each"), 1, block);
}

rb_define_method(rb_cKernel, "my_method", my_method, -1);

I'm sure this code won't work right out of the gate, but it should be close to
what you're after.

  Sean O'Dell

···

On Tuesday 22 June 2004 11:22, 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
> my_method do |r|
irb* puts r
> end
LocalJumpError: no block given
         from (irb):4:in `each'
         from (irb):4:in `my_method'
         from (irb):4
> exit
$ more test.c
#include <ruby.h>
#include <intern.h>

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);
}

void Init_test()
{
         rb_define_module_function(rb_mKernel, "my_method", my_method,
0);
}

Hi,

At Wed, 23 Jun 2004 03:22:30 +0900,
Charles Mills wrote in [ruby-talk:104362]:

#include <ruby.h>
#include <intern.h>

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_iterate(rb_each, ary, rb_yield, 0);

···

}

--
Nobu Nakada

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
> my_method do |r|
irb* puts r
> end
LocalJumpError: no block given
         from (irb):4:in `each'
         from (irb):4:in `my_method'
         from (irb):4
> exit
$ more test.c
#include <ruby.h>
#include <intern.h>

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".

···

On Jun 22, 2004, at 11:54 AM, Jeff Mitchell wrote:

--- Charles Mills <cmills@freeshell.org> wrote:

}

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

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
> my_method do |r|
irb* puts r
> end
LocalJumpError: no block given
         from (irb):4:in `each'
         from (irb):4:in `my_method'
         from (irb):4
> exit
$ more test.c
#include <ruby.h>
#include <intern.h>

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" when calling a method (in this case "each") on a Ruby object (in this case ary) created in "my_method".

So the result I am looking for is puts getting called on each element of ary.

···

On Jun 22, 2004, at 11:54 AM, Jeff Mitchell wrote:

--- Charles Mills <cmills@freeshell.org> wrote:

}

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