私は長い間Pythonを使用していて、Rubyをいじり始めたばかりですが、特にC-APIで見ると、2つの言語のモジュールの違いが非常にわかりにくいことがわかりました。たとえば、これは小さなルビーCモジュールです
#include "Python.h"
#include "ruby.h"
VALUE PyModule = Qnil;
void Init_pymodule();
VALUE method_Py_Initialize();
VALUE method_PyRun_SimpleString();
void Init_pymodule() {
PyModule = rb_define_module("PyModule");
rb_define_method(PyModule, "Py_Initialize", method_Py_Initialize, 0);
rb_define_method(PyModule, "PyRun_SimpleString", method_PyRun_SimpleString, 1);
}
VALUE method_Py_Initialize(VALUE self) {
Py_Initialize();
return Qnil;
}
VALUE method_PyRun_SimpleString(VALUE self, VALUE command) {
return INT2NUM(PyRun_SimpleString(RSTRING(command)->as.ary));
}
インポートしてそのように呼び出すと
require "pymodule"
PyModule.Py_Initialize()
PyModule.PyRun_SimpleString("print 'hellooo'")
Pythonのモジュールが機能するのと同じように機能することを期待していました。ただし、PyModule
クラスを拡張するためにを使用するか、を使用する必要があることがわかりましたinclude "PyModule"
。PyModule
Pythonのセマンティクスと同様に、これらの関数をモジュールオブジェクトにアタッチする方法を探しています。また、Rubyで実際に何が起こっているのかが気になります。