gpt4 book ai didi

c++ - 从 C++ 调用 Ruby 类方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:20 25 4
gpt4 key购买 nike

我正在尝试从 C++ 调用类方法。我已经尝试了所有组合rb_intern 我可以想到让它工作,但我一无所获。

示例类

class CallTest   def go    (do something here)   endend

尝试用 C++ 调用:

rb_funcall(?, rb_intern("go"), 0);

里面有什么?空间?我知道如果我在那里使用 Qnil,它会调用全局函数,但我更喜欢类方法。

我是不是走错方向了?

此外,如果需要,我宁愿不必提前知道类名可能,但如果我必须要求我知道它是什么,我可以尝试按名称将其传递给我的应用程序。

我正在使用 SWIG 生成绑定(bind)。

最佳答案

首先,正如您定义的那样,go 不是类方法,而是实例方法

作为一种面向对象的语言,所有的ruby 方法都需要一个接收者,即调用该方法的对象。对于实例方法,接收者是类的实例,对于类方法,接收者是类对象本身。

那个?您拥有的占位符是方法调用接收者的插槽。

如果你想把它保留为一个实例方法,那么你需要这样做:

rb_funcall(a_CallTest_instance, rb_intern("go"), 0);

其中 a_CallTest_instance 是您使用 rb_class_new_instance() 创建的 CallTest 实例。

如果你把它变成一个类方法:

class CallTest
def self.go
# ...
end
end

然后你需要使用 CallTest 类本身作为接收者:

rb_funcall(klass, rb_intern("go"), 0);

您可以使用 rb_const_get()

获取对 CallTest 类的引用
VALUE klass = rb_const_get(rb_cObject, rb_intern('CallTest'));

在那里使用 rb_cObject,因为 CallTest 是在全局上下文中定义的。

我建议阅读 Pickaxe 中关于扩展 ruby​​ 的章节。

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

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