Ruby对象类中的类方法

时间:2016-07-05 08:56:34

标签: ruby

我试图实现自己的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,它都会有效}类。为什么呢?

3 个答案:

答案 0 :(得分:4)

这称为"继承"。在Ruby中,子类"继承"来自超类的方法。换句话说,如果你向对象发送消息,Ruby将查找一个名称与对象类中的消息匹配的方法,如果它找不到它,它将遵循这些类'超类指针,然后那个类'超类指针,依此类推,直到它找到一个匹配的方法或者到达一个没有超类的类。

由于ClassObject的子类(间接通过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"