从C++调用Ruby类方法

Rob*_*use 5 c++ ruby

我正在尝试从C++调用类方法.我已经尝试过rb_intern的所有组合,我可以想到让它工作,但我什么都没有.

示例类

class CallTest
   def go
    (do something here)
   end
end

试图用C++调用:

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

怎么了?空间?我知道如果我在那里使用Qnil,它将调用全局函数,但我更喜欢类方法.

我是朝着错误的方向前进的吗?

另外,如果可能的话,我不希望提前知道类名,但是如果我必须要求我知道它是什么,我可以尝试将它按名称传递给我的应用程序.

我正在使用SWIG生成绑定.

ram*_*ion 7

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

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

的?你拥有的占位符是方法调用的接收者的插槽.

如果要将其保留为实例方法,则需要执行以下操作:

rb_funcall(a_CallTest_instance, rb_intern("go"), 0);
Run Code Online (Sandbox Code Playgroud)

这里a_CallTest_instance是CallTest的实例创建使用rb_class_new_instance().

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

class CallTest
  def self.go
    # ...
  end
end
Run Code Online (Sandbox Code Playgroud)

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

rb_funcall(klass, rb_intern("go"), 0);
Run Code Online (Sandbox Code Playgroud)

您可以CallTest使用该类引用rb_const_get()

VALUE klass = rb_const_get(rb_cObject, rb_intern('CallTest'));
Run Code Online (Sandbox Code Playgroud)

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

我建议阅读Pickaxe关于扩展红宝石的章节.