繁体   English   中英

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

[英]Alias module`s method in C(Ruby Extension)

我无法从元帅模块中使用别名方法“转储”

#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]

我该怎么做别名?

您的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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM