Ruby Eigenclass详解_Ruby_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > Ruby > Ruby Eigenclass详解

Ruby Eigenclass详解

 2011/8/10 17:30:52  cxh116  http://mangege.iteye.com  我要评论(0)
  • 摘要:经过三个多月的RUBYP实战,重新细读了电子书<Ruby编程语言_涵盖Ruby1.8和1.9>,终于理解了Eigenclass,也就是我们常说的元类(Metaclass)目标:证明Kitty类是其Eigenclass的实例为了文字好解説,先上代码classKittydefhiputs'hikitty'endclass<<selfObject::A=self#获取Kitty的eigenclass类deffooendendendclassObject:
  • 标签:详解 Ruby
  经过三个多月的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
发表评论
用户名: 匿名