我正在尝试从C++调用类方法.我已经尝试过rb_intern的所有组合,我可以想到让它工作,但我什么都没有.
示例类
class CallTest def go (do something here) end end
试图用C++调用:
rb_funcall(?, rb_intern("go"), 0);
怎么了?空间?我知道如果我在那里使用Qnil,它将调用全局函数,但我更喜欢类方法.
我是朝着错误的方向前进的吗?
另外,如果可能的话,我不希望提前知道类名,但是如果我必须要求我知道它是什么,我可以尝试将它按名称传递给我的应用程序.
我正在使用SWIG生成绑定.
首先go
,正如您所定义的那样,不是类方法,而是实例方法.
作为面向对象的语言,所有ruby方法都需要一个接收器,即调用该方法的对象.例如,方法,接收器是类的实例,对于类方法,接收器是类对象本身.
的?你拥有的占位符是方法调用的接收者的插槽.
如果要将其保留为实例方法,则需要执行以下操作:
rb_funcall(a_CallTest_instance, rb_intern("go"), 0);
这里a_CallTest_instance
是CallTest的实例创建使用rb_class_new_instance()
.
如果你把它变成一个类方法:
class CallTest def self.go # ... end end
然后你需要使用CallTest
类本身作为接收器:
rb_funcall(klass, rb_intern("go"), 0);
您可以CallTest
使用该类引用rb_const_get()
VALUE klass = rb_const_get(rb_cObject, rb_intern('CallTest'));
在rb_cObject
那里使用,因为CallTest
在全局上下文中定义.
我建议阅读Pickaxe关于扩展红宝石的章节.