0

私は長い間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"PyModulePythonのセマンティクスと同様に、これらの関数をモジュールオブジェクトにアタッチする方法を探しています。また、Rubyで実際に何が起こっているのかが気になります。

4

1 に答える 1

3

モジュールは、RubyとPythonの両方で名前空間として役立ちますが、Rubyのモジュールは、ミックスインとしても機能するという点で異なります。

混乱は、インスタンスメソッド(定義しているメソッドやモジュールを含めるときにインポートされるメソッドなど)とシングルトンメソッド(呼び出そうとしているメソッドやインクルード時にインポートされないメソッドなど)の間です。

rb_define_singleton_method代わりに使用することができrb_define_method、あなたはあなたが望む効果を得るでしょう。ただし、その場合、モジュールにはインスタンスメソッドがないため、モジュールを含めたり拡張したりしても効果はありません。

私は個人的に、メソッドをインスタンスメソッドとして定義し、モジュールをそれ自体で拡張して、メソッドが両方の方法で使用できるようにすることを好みます。Cでは、これを行うために使用できますrb_extend_object(PyModule, PyModule);

于 2012-02-15T22:31:49.543 に答える