Wrapping a C Function as a Block #
I had previously been using rb_iterate
and a call to Proc.new
to build a block in C. But that takes two function calls while the undocumented rb_proc_new
is just one.
require 'rubygems' require 'inline' module Kernel inline do |ext| ext.prefix %{ static VALUE sum(VALUE args) { return rb_funcall(rb_ary_entry(args, 0), rb_intern("+"), 1, rb_ary_entry(args, 1)); return Qnil; } } ext.c %{ VALUE sum_block() { return rb_proc_new(sum, 0); } } end end p sum_block[13, 2] p (0..20).inject(0, &sum_block)
Most of the time rb_iterate
is what you need. But, you know, in case you actually want a Proc object.
zimbatm
_why’s blog posts make me happy :)
FlashHater
RubyInline is really cool.
why
zimbatm: What about what makes me happy?? I’ve been waiting sooo patiently for rwm!!
FlashHater: Yes.
zenspider
argh. this comment system bites… keeps ignoring my post w/o a reason.
why, change c_raw to prefix unless you intend sum to be a public method as well.
why
Oh, okay, just like that.
ryan
does that mean you can write assembly in c in ruby?