我正在编写一个 Ruby 1.9 C 扩展,我想在 ruby 中执行以下操作:
notifier = Notifier.new
notifier.on 'click' do
puts "clicked!"
end
现在的问题是,在 C 方法上,我只“接收”了一个 block ,据我所知,它甚至不是一个参数:我只能用 rb_yield
.
所以我的问题是:在 Ruby 1.9 C 扩展上有没有办法将 block 转换为 proc 或其他东西,这样我就可以将它存储在我的模块中,并在以后需要/需要它们时调用它?就像一个异步回调!
我已经用 Procs/lambdas 实现了这个,但是不直接使用 block 语法太丑了。
最佳答案
在 Ruby C 源代码中,您将在 proc.c
中看到:
/*
* call-seq:
* proc { |...| block } -> a_proc
*
* Equivalent to <code>Proc.new</code>.
*/
VALUE
rb_block_proc(void)
{
return proc_new(rb_cProc, FALSE);
}
和Proc.new
这样做:
Creates a new
Proc
object, bound to the current context.Proc::new
may be called without a block only within a method with an attached block, in which case that block is converted to theProc
object.
所以你会做这样的事情:
VALUE p = rb_block_proc();
/* and then store `p` somewhere convenient */
然后,调用 block /Proc:
rb_funcall(p, rb_intern("call"), 0);
rb_funcall
几乎是 p.send(:call)
的 C 版本。
关于c - 如何在 Ruby 1.9 C 扩展中将 Block 转换为 Proc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8902871/