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

Alias module`s method in C(Ruby Extension)

我无法从 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 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()功能。它 returns 单例 class 并且可以像这样使用来修复你的代码:

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