Ruby Eigenclass详解

  经过三个多月的RUBYP实战,重新细读了电子书<Ruby编程语言_涵盖Ruby 1.8和1.9>,终于理解了Eigenclass,也就是我们常说的元类(Metaclass)

  目标: 证明Kitty类是其Eigenclass的实例

  为了文字好解説,先上代码
class Kitty
  def hi
    puts 'hi kitty'
  end

  class << self
    Object::A = self #获取Kitty的eigenclass类
    def foo
    end
  end
end

class Object::A #打开Kitty的eigenclass类
  def hello
    puts 'hello kitty'
  end
end

k = Kitty.new
k.hi
Kitty.hello #调用实例方法
puts Object::A.instance_methods.include? 'hello'

# Object::A.new  #报can't create instance of virtual class (TypeError) 错误


说明一下关系
k 是Kitty的实例,Kitty是其元类(Eigenclass)的实例

步骤:
  1. 获取Kitty的Eigenclass
  2. 打开Kitty的Eigenclass类,定义一个实例方法
  3. Kitty调用实例方法,如果成功,表示,Kitty是其Eigenclass的实例


事实上,说Kitty类是其Eigenclass的实例我想是不正确的.
看代码
message = "hello"
class << message
  def world
    puts 'hello world'
  end
end
message.world


那么字符串"hello"是谁的实例,是String,还是"hello"的eigenclass的实例?

在书的258页提到方法的查找顺序,首先在对象的eigenclass查找单键方法.
也就是说,对象的单键方法都定义在对象的其eigenclass里
这也就解释了Kitty.singleton_methods为什么会输出["hello","foo"].因为这两个方法都定义在Kitty的eigenclass里

最终结论, 所有的对象都有一个eigenclass,包括类对象Kitty

你可能感兴趣的:(Ruby,eigenclass,kitty)