我一直在使用Python很久,并且刚开始玩弄Ruby,但是我发现两个模块之间的差异语言真的很混乱,特别是通过C-API查看时。例如,这里是一个小红宝石C模块中Python模块语义与其C-API中的Ruby模块语义
#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中实际发生了什么,使其发生了这种行为。
是的,这正是问题所在。 Ruby有一个有趣的元类模型,因为你可以扩展自己的类。 – dcolish 2012-02-16 17:40:37