当前位置:  开发笔记 > 编程语言 > 正文

从C++调用Ruby类方法

如何解决《从C++调用Ruby类方法》经验,为你挑选了1个好方法。

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

示例类

class CallTest
   def go
    (do something here)
   end
end

试图用C++调用:

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

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

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

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

我正在使用SWIG生成绑定.



1> rampion..:

首先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关于扩展红宝石的章节.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有