我知道attr_accessor是在Module类中定义的,但我试图找到Module类的源文件而无法找到它。我在我的红宝石目录中递归搜索'def attr_accessor'而什么都没有?
知道它可能在哪里吗?
答案 0 :(得分:9)
模块#attr_accessor在C中实现。如果使用Pry,可以看到方法定义:
[2] pry(main)> show-method Module#attr_accessor
From: object.c in Ruby Core (C Method):
Number of lines: 10
Owner: Module
Visibility: private
static VALUE
rb_mod_attr_accessor(int argc, VALUE *argv, VALUE klass)
{
int i;
for (i=0; i<argc; i++) {
rb_attr(klass, rb_to_id(argv[i]), TRUE, TRUE, TRUE);
}
return Qnil;
}
[3] pry(main)>
答案 1 :(得分:3)
在Rubinius中,它位于kernel/delta/module.rb
:
def attr_accessor(*names)
vis = Rubinius::VariableScope.of_sender.method_visibility
names.each do |name|
Rubinius.add_reader name, self, vis
Rubinius.add_writer name, self, vis
end
return nil
end
答案 2 :(得分:2)
模块(和attr_accessor)是ruby的C源代码的一部分。它位于来源的https://github.com/ruby/ruby/blob/trunk/object.c#L1796