c - 如何在 Ruby 1.9 C 扩展中将 Block 转换为 Proc?

标签 c ruby block ruby-1.9 ruby-c-extension

我正在编写一个 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 the Proc 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/

相关文章:

ios - NSParagraphStyle iOS - 如何检测 block 和列表?

c# - WinForms WebBrowser 阻止 ProcessCmdKey

c - g_strduping 一个 char 数组成员元素

c - 通过 typedef 传递和使用结构

c - C 中的二叉搜索树。

ruby-on-rails - 根据调用请求的位置呈现不同的模板?

c - 如何从我的 c 扩展访问 ruby​​ 数组?

ruby - 有人可以用评论解释/注释这个 Ruby 片段吗?

ruby - 预期为 ArgumentError 但得到 NoMethodError

c - 如何使用函数中生成的两个随机数作为矩阵坐标?