Python模块语义与C-API中的Ruby模块语义
我已经使用Python很长时间了,我刚刚开始玩弄Ruby,但我发现这两种语言中的模块之间的差异确实令人困惑,特别是通过它们的C-API查看时。例如,下面是一个小的ruby C模块Python模块语义与C-API中的Ruby模块语义,ruby,ruby-c-extension,Ruby,Ruby C Extension,我已经使用Python很长时间了,我刚刚开始玩弄Ruby,但我发现这两种语言中的模块之间的差异确实令人困惑,特别是通过它们的C-API查看时。例如,下面是一个小的ruby C模块 #include "Python.h" #include "ruby.h" VALUE PyModule = Qnil; void Init_pymodule(); VALUE method_Py_Initialize(); VALUE method_PyRun_SimpleString(); void Init_
#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
来扩展类,或者必须使用包含“PyModule”
。我正在寻找一种让PyModule
将这些函数附加到模块对象的方法,类似于Python的语义。我也很好奇Ruby中到底发生了什么,使得它有了这种行为。模块在Ruby和Python中都可以用作名称空间,但Ruby中的模块不同,它们也可以用作混合
您的混淆是实例方法(如您正在定义的、在包含模块时导入的方法)和单例方法(如您试图调用的、在包含时未导入的方法)
您可以使用rb\u define\u singleton\u方法
而不是rb\u define\u方法
,您将获得想要的效果。但是,在这种情况下,您的模块将没有任何实例方法,因此包含或扩展它不会产生任何效果
我个人更喜欢将这些方法定义为实例方法,并对模块本身进行扩展,从而使这些方法在两种方式中都可用。在C语言中,可以使用
rb_extend_对象(PyModule,PyModule)在Ruby和Python中,模块可以作为名称空间使用,但Ruby中的模块不同,它们也可以作为混入
您的混淆是实例方法(如您正在定义的、在包含模块时导入的方法)和单例方法(如您试图调用的、在包含时未导入的方法)
您可以使用rb\u define\u singleton\u方法
而不是rb\u define\u方法
,您将获得想要的效果。但是,在这种情况下,您的模块将没有任何实例方法,因此包含或扩展它不会产生任何效果
我个人更喜欢将这些方法定义为实例方法,并对模块本身进行扩展,从而使这些方法在两种方式中都可用。在C语言中,可以使用rb_extend_对象(PyModule,PyModule)代码>这样做。是的,这正是问题所在。Ruby有一个有趣的元类模型,你可以用它自己扩展一个类。是的,这正是问题所在。Ruby有一个有趣的元类模型,因为您可以用它自己扩展一个类。