在C++应用程序中嵌入Ruby解释器

and*_*ers 19 c++ ruby scripting

我希望将Ruby用作我的游戏引擎的脚本语言.我发现通常的文章描述了如何从C++代码调用Ruby类(反之亦然)(例如这里),但我不太清楚如何用这种工作方式做我想做的事......

我的引擎目前使用的是我用Flex和Bison编写的一种语言,以及一个基于小堆栈的虚拟机.脚本并不总是从头到尾运行,例如它们有时包括"睡2秒"或"等到角色走完"之类的命令,因此调度程序会密切关注每个脚本的状态和指令指针,并知道何时恢复它们,依此类推.

因此,我似乎真的需要某种嵌入式Ruby解释器,我可以对其进行一定程度的控制,而不是简单地调用Ruby方法.或者我只是迟钝而错过了什么?

我正在使用Microsoft Visual C++,所以理想情况下,任何解决方案都可以很好地编译.

wed*_*oft 29

这是一个包含错误处理的例子.

#include <iostream>
#include <ruby.h>

using namespace std;

int main(void)
{
  ruby_init();
  ruby_init_loadpath();
  int status;
  rb_load_protect(rb_str_new2("./test.rb"), 0, &status);
  if (status) {
    VALUE rbError = rb_funcall(rb_gv_get("$!"), rb_intern("message"), 0);
    cerr << StringValuePtr(rbError) << endl;
  };
  ruby_finalize();
  return status;
}
Run Code Online (Sandbox Code Playgroud)


Pes*_*sto 4

你走在正确的轨道上。关键是执行与您发布的链接中的“嵌入概念”部分类似的操作。简单来说,它只不过是:

ruby_init();
ruby_script("some_script");
Run Code Online (Sandbox Code Playgroud)

您可能需要复制main.c#ifdef中的所有内容才能使一切正常工作。从那时起,就需要为您想要公开的 C++ 函数构建一个 API,并根据您的设计,对它进行多线程处理。