gpt4 book ai didi

c++ - 使用 Rice 从 C++ 调用 Ruby block

转载 作者:行者123 更新时间:2023-11-30 04:24:45 26 4
gpt4 key购买 nike

我正在为我正在编写的 C++ 库编写一个 Ruby 接口(interface)。 C++ 库提供了几种基于比较函数的数据结构,例如 FibonacciHeap。使用 ruby​​ 比较函数工作正常,即以下 Ruby 代码工作:

f = FibonacciHeap.new
f.push(24)
f.push(2)
f.push(89)
raise unless f.top == 2

但我想让用户能够提供自己的比较功能,例如像这样:

f = FibonacciHeap.new { |a, b| a.length <=> b.length }
f.push("asdf")
f.push("a")
f.push("adsfdsafdsaf")
raise unless f.top == "a"

但即使使用谷歌,我也没有找到如何在 Rice 中使用 block 。我发现的唯一一件事是如何从 C++ 迭代器定义 ruby​​ each 方法,这当然需要一个 block 。我想一旦我存储了 proc 对象,这很容易,我只需使用适当的参数调用 ruby​​ 方法“调用”它,但是我如何检查构造函数是否被赋予了一个 block ,如果是,存储阻塞到 proc 对象中?

如果我可以检查 block 接受的参数数量,那就更好了,但我不知道这是否可能,但用户可以在简单的情况下提供类似的东西

f = FibonacciHeap.new { |a| a.length }

如果他不需要提供 a <=> b 的完全灵 active 功能。

最佳答案

在 C 代码中,您可以调用:

rb_yield(value);

在Rice代码中,你可以使用:

Rice::protect(rb_yield, value);

(Rice::protect 确保正常的 C++ 异常行为)。

这就是 Rice::Module::define_iterator 屈服于 ruby​​ 代码的方式。

关于c++ - 使用 Rice 从 C++ 调用 Ruby block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12496211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com