2015-08-14 94 views
2

我不能老是別名法 「傾倒」 從元帥模塊別名module`s方法C(Ruby擴展)

#include "ruby.h" 
VALUE Marshal = Qnil; 
void Init_test(){ 
    Marshal = rb_define_module("Marshal"); 
    rb_define_alias(Marshal, "hal_dump", "dump");//No error, but don`t work 
} 

在紅寶石:

require './test' 
p Marshal.methods.grep(/dump/).sort #[:dump] 

我可怎麼辦別名嗎?

回答

3

你的C代碼是類似於以下Ruby代碼:

module Marshal 
    alias hal_dump dump 
end 

dump is a singleton method而且私有實例方法(即組合是一個所謂的模塊功能)。您只能定義私有實例方法的別名。

p Marshal.private_instance_methods.grep(/dump/) # => [:dump, :hal_dump] 

這也是爲什麼你沒有得到一個錯誤。但是,您想要定義單例方法的別名。這可以通過opening the singleton class完成。一個修正的Ruby版本可能是這樣的:

p Marshal.methods.grep(/dump/) # => [:dump] 
class << Marshal 
    alias hal_dump dump 
end 
p Marshal.methods.grep(/dump/) # => [:dump, :hal_dump] 

的MRI C API實現rb_singleton_class()功能。它返回單個類,可用於像這樣來解決您的代碼:

rb_define_alias(rb_singleton_class(Marshal), "hal_dump", "dump"); 
+1

'dump'使用'rb_define_module_function',它定義了一個模塊(單身)方法_and_私有的實例方法(否則你實際上定義嘗試別名時出錯)。 'p Marshal.private_instance_methods'應該顯示它。 – matt

+0

@matt:謝謝,我錯過了。我會很快糾正我的答案。 – cremno