I've been discussing a conceptual project with a friend of mine and the the most effective way we've seen of doing it is writing the engine in C++ while the logic would be done in Ruby.
However, we would need data to be passed around often, for example:

  • Engine reports that A happened, that gets triggered in a proc array (event "A" is passed but proc doesnt use it)
  • Ruby decides that we need to wait for B to happen
  • Ruby adds a proc to an array. The array of procs is iterated during each cycle in the C++ engine
  • C++ engine reports that B happened and passes "event B (should be a Ruby object)
  • Ruby receives event B and decides what to do next

I don't work with multiple languages often, and was wondering if it's possible to implement things in this way. I know that there's the ruby VALUE in C++, but what is the standard way of combining the two? Of course I know Ruby follows the Perl "more than 1 way to do it", but there's often a standardized way.

I ran a quick test with SWIG but quickly ran into a problem. From what I can see, Ruby (1.9.3p286, though it uses the 1.9.1 gems afaik) can't load the shared object. Here's the code, actions done and more information.

I tried compiling to the latest Ruby and SWIG version to see if maybe it was some compile error upstream. I got no errors and the problem remains. Seems it might be an incompatibility between these SWIG and Ruby versions... or a problem with the current Ruby version.

  • 2
    Take a look at SWIG. – yannis Nov 4 '12 at 2:19
  • @YannisRizos I've seen SWIG but it seems very inelegant and passing values would be difficult, wouldn't it? – user49306 Nov 4 '12 at 16:26
  • I ran your swig test, and I think you just forgot to make install after make. – Andrew says Reinstate Monica Jul 12 '17 at 18:59

Swig is the way to go. The data passing is also possible there in my understanding with typemaps. Have a look at it.

Also look at some helpful links below

  • I've read SWIG and Extending Ruby, both of which failed (see the two edits). Thanks for the rice link, I'll take a look at it and accept answer if it works. – user49306 Nov 5 '12 at 13:37

I also faced the same problem. Looks like ruby interpreter expects ".so" extension even on windows. So renaming the '.dll' to '.so' solved the issue. This is required for ruby versions after 1.9

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy