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");
我无法从 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");