+1 For sticking just with C. (BTW C is a procedural language, a functional language is something else entirely)
Ruby is itself written in C so even if you choose to use C++, you need to do C calls into Ruby.
Start with TBD example code. It deliberately starts with just doing some simple math to get your confidence.
The key thing for dealing with Ruby in SU, is that Ruby has been bolted-in (in a good way) to the underlying C++ SU application. This means in your Ruby extension you can call all of the Ruby functions you normally have.
eg
VALUE model = rb_funcall(sketchup, rb_intern("active_model"), 0);
will set model to a reference to the active model. You could then do:
rb_funcall( model, rb_intern("entities"), 0)
to get the entities of the active model.
Because Ruby automatically cleans up unused objects, you ask for the active_model object, use it for a bit and then move on, knowing Ruby will "Garbage Collect" the memory used for that by automatically working out when you're not using it anymore.
<gross simplification>You therefore cannot hold onto Ruby references beyond the scope of your function</gross simplification>
Notwithstanding Todd's comments in the other thread, Ruby Garbage Collection will remove objects from underneath you if you keep references around. There are ways around this but it makes things complex for anything but very simple Extensions.
I'd suggest you take an educated guess as to where the bottlenecks in your plugin are, and then write a single C function that does the heavy lifting just for that. But be aware that, walking every face in a model in Ruby and doing the same in C which is calling Ruby, is going to be the same speed. You need to identify areas that can be cast into pure C, do lots of calcs, then turn the answer back into a Ruby object.
Adam