gpt4 book ai didi

c++ - 如何获取在当前 RB 文件中运行的 Ruby 类的实例? (在 C++ 中嵌入 Ruby)

转载 作者:太空宇宙 更新时间:2023-11-04 12:28:35 26 4
gpt4 key购买 nike

我在我的 C++ 应用程序中嵌入了 Ruby。我使用 SWIG 生成了绑定(bind)。

基本上,我运行 ruby​​ 文件,然后 Ruby 接管并调用我的 C++ 类。

根据我之前的问题,我想将 ruby​​ 文件中定义的类的当前实例返回给 C++ 类,以便我可以执行实例方法。

我按如下方式执行 ruby​​ 文件:

rb_eval_string_protect(<ruby script string>, &status );

rb_funcall(Qnil, rb_intern("main"), 0);

脚本中的全局 main 方法创建文件中已定义类的实例。这就是我所追求的实例。

如果必须,我会添加一个参数或另一个函数来传回实例,但是,我不确定如何在 C++ 中定义它,以便当 SWIG 生成绑定(bind)时,一切正常。

如有任何帮助,我们将不胜感激。

上一个问题:Calling Ruby class methods from C++

最佳答案

ruby 的 C api 尽最大努力保留 ruby​​ 的功能特性,因此 rb_eval_string_protect() 返回给定脚本最后一行的 VALUE,而 rb_funcall() 返回所调用方法的最后一行的值。

所以真正的诀窍是将其视为如何在纯 ruby​​ 中获取实例值?如果只是main的返回值,比如

# I'm a ruby script!
main_retval = main()

然后在C中捕获返回值类似:

// I'm some C (or C++) code
VALUE main_retval;
// ...
rb_eval_string_protect("...", &status);
main_retval = rb_funcall(Qnil, rb_intern("main"), 0);

并且会为您提供对 main 返回的 ruby​​ 对象的引用。

你可以正常使用这个对象,调用方法之类的

VALUE main_retval_as_string = rb_funcall(main_retval, rb_intern("to_s"), 0);

关于c++ - 如何获取在当前 RB 文件中运行的 Ruby 类的实例? (在 C++ 中嵌入 Ruby),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/497179/

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