别名模块的方法在C(Ruby扩展)



我不能从Marshal模块中别名方法"dump"

#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
}
在ruby:

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

如何做别名?

您的C代码类似于以下Ruby代码:

module Marshal
  alias hal_dump dump
end

dump是一个单例方法,也是一个私有实例方法(这种组合就是所谓的模块函数)。您只能定义私有实例方法的别名。

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

这也是为什么你不会得到一个错误。但是,您需要定义单例方法的别名。这可以通过打开单例类来实现。修改后的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");

最新更新