2012-02-15 1 views
0

저는 오랫동안 파이썬을 사용 해왔고 방금 Ruby를 둘러 보았습니다.하지만 두 모듈의 차이점을 발견했습니다. 특히 C-API를 통해 볼 때 언어가 혼란 스럽습니다. 내가 오기 때문에파이썬 모듈 의미론과 C-API의 루비 모듈 의미론

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

내가 파이썬의 모듈이 어떻게 작동하는지와 비슷한 일을 예상처럼 그를 호출 할 때 예를 들어, 여기에 작은 루비 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이 파이썬의 의미와 비슷한 모듈 객체에이 함수들을 첨부 할 수있는 방법을 찾고있다. Ruby에서 실제로 이런 일이 발생하는지 궁금합니다.

답변

3

모듈은 루비와 파이썬 모두에서 네임 스페이스로 유용 할 수 있지만 루비의 모듈은 믹스 인 역할을한다는 점에서 다릅니다.

귀하의 혼란이 예를 사이의 방법이며, 싱글 (당신이 정의하고 모듈을 포함하는 경우 그 수입되는 것과 같은) 방법 (포함에 가져올 수 없습니다 당신이 전화를 시도하고되는 것과 같은) .

rb_define_method 대신 rb_define_singleton_method을 사용할 수 있으며 원하는 효과를 얻을 수 있습니다. 이 경우에는 모듈에 인스턴스 메서드가 없으므로 모듈을 포함하거나 확장하면 아무런 효과가 없습니다.

개인적으로 메서드를 인스턴스 메서드로 정의하고 모듈 으로 확장하여 메서드를 두 가지 방식으로 사용할 수있게하는 것이 좋습니다. C 언어에서는 rb_extend_object(PyModule, PyModule);을 사용하면됩니다.

+0

네, 그게 정확히 문제입니다. Ruby는 클래스 자체를 확장 할 수 있다는 점에서 흥미로운 메타 클래스 모델을 가지고 있습니다. – dcolish