[英]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.