2012-02-15 8 views
0

私は長い間Pythonを使用してきましたが、Rubyを使い始めたばかりですが、2つのモジュールの違いを見ています特にC-APIを通して見たときには、本当に混乱します。私はインポートし、そうPythonモジュールのセマンティクスとC-APIのRubyモジュールのセマンティクス

require "pymodule" 
PyModule.Py_Initialize() 
PyModule.PyRun_SimpleString("print 'hellooo'") 

私はPythonのモジュールがどのように動作するかに似て動作するように期待されるようにそれを呼び出す場合たとえば、ここに小さなルビー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)); 
} 

です。しかし、私はPyModuleを使用してクラスを拡張するか、include "PyModule"を使用する必要があることを発見しました。私はPyModuleにPythonのセマンティクスに似たモジュールオブジェクトにこれらの関数を付ける方法を探しています。また、実際にRubyで何が起きているのかが不思議です。

答えて

3

モジュールはRubyとPythonの両方で名前空間として役立ちますが、Rubyのモジュールはmixinsとしても機能します。

あなたの混乱がインスタンス間の方法であるとシングルトン(あなたが定義しているとモジュールを含むときには輸入されているものなど)方法(インクルージョンにインポートされていないあなたが呼び出そうとしているされているものなど) 。

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

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

+0

はい、それはまさに問題です。 Rubyは、自分自身でクラスを拡張できるという点で、面白いメタクラスモデルを持っています。 – dcolish

関連する問題