我试图实现自己的attr_accessor
方法。我实现了如下。
class Object
def my_attr_accessor(*args) # self.my_attr_accessor(*args)
args.each do |arg|
define_method "#{arg}" do
return instance_variable_get("@#{arg}")
end
define_method "#{arg}=" do |val|
instance_variable_set("@#{arg}", val)
end
end
end
end
然后我创建了一个调用my_attr_accessor
方法的类。
class Runner
my_attr_accessor :name
end
test= Runner.new
test.name = "runner"
puts test.name
我的问题是即使我没有明确定义self.my_attr_accessor
方法,它也是一个类方法。有人可以帮我弄清楚它是如何发生的。
编辑:无论是self.my_attr_accessor
课程中的my_attr_accessor
还是Object
,如果我在my_attr_accessor
中说Runner
,它都会有效}类。为什么呢?
答案 0 :(得分:4)
这称为"继承"。在Ruby中,子类"继承"来自超类的方法。换句话说,如果你向对象发送消息,Ruby将查找一个名称与对象类中的消息匹配的方法,如果它找不到它,它将遵循这些类'超类指针,然后那个类'超类指针,依此类推,直到它找到一个匹配的方法或者到达一个没有超类的类。
由于Class
是Object
的子类(间接通过Module
),因此它会继承Object
的方法。
[注意:继承是Ruby中的一个基本概念,在尝试高级反射元编程之前,你应该回过头来学习Ruby的基础知识。特别是如何构造祖先链(超类指针)和消息调度工作。]
答案 1 :(得分:1)
由于ruby中的所有内容都是Object的实例,因此您可以从任何地方调用您的方法:
Boolean isValidAscii(Byte[] bytes) {
return true;
}
答案 2 :(得分:0)
您使用Runner.new
创建了一个新的Runner。所以你有一个Runner类的实例
由于您在类块中调用了my_attr_accessor,因此您已在实例上创建了方法.name
。这个很重要。 my_attr_accessor
是对方法my_attr_accessor的调用。在基类中,即在Object中,Ruby找到了这个方法并调用它
现在,您可以致电test.name = "runner"
。