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.
3
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
- Extending Ruby
- rice (Github)
- Ruby extention with C
1
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