Ruby元编程笔记——4.类定义

类定义揭秘

当前类小结

  • 在类定义中,当前对象self就是正在定义的类。
  • Ruby解释器总是追踪当前类(模块)的引用。所有使用def定义的方法都成为当前类的实例方法。
class MyClass
  def method_one
    def method_two
      'Hello!'
    end
  end
end
obj = MyClass.new
obj.method_one
obj.method_two                     # => "Hello!"
  • 在类定义中,当前类就是self——正在定义的类。
  • 如果有一个类的引用,则可以用class_eval()(或module_eval())方法打开这个类。

类变量

类变量与类实例变量不同,它可以被子类或类的实例所使用。
不幸的是,类变量有一个很不好的怪癖。下面是一个例子:

@@v = 1
class MyClass
  @@v = 2
end
@@v        # => 2

得到这样的结果是因为类变量并不真正属于类——它们属于类体系结构。由于@@v定义于main的上下文,它属于main的类Object……所以也属于Object的所有后代。MyClass继承自Object,因此它也共享了这个类变量。

单件方法

只针对单个对象生效的方法,称为单件方法。

str = 'hello'
def str.title?
  self.upcase == self
end

关于类方法的真相

def object.method
end

在上面的定义中,object可以是对象引用、常量类名或self。在这三种方式中,定义的语法可能看起来有些不同——但实际上,底层的机制都是一样的。

类宏

Eigenclass

image.png

image.png

大一统理论

Ruby对象模型可以总结为7条规则:
1.只有一种对象——要么是普通对象,要么是模块。
2.只有一种模块——可以是普通模块、类、eigenclass或代理类(把模块混合进入到祖先链中)。
3.只有一种方法——它存在于一种模块中——通常是类中。
4.每个对象(包括类)都有自己的“真正的类”——要么是普通类,要么是eigenclass。
5.除了BasicObject类无超类外,每个类有且只有一个超类。这意味着从任何类只有一条向上直到BasicObject的祖先链。
6.一个对象的eigenclass的超类是这个对象的类;一个类的eigenclass的超类是这个类的超类的eigenclass。
7.当调用一个方法,Ruby先向“右”迈一步进入接收者真正的类,然后向“上”进入祖先链。这就是Ruby查找方法的全部内容。


image.png

Object.extend

环绕别名

1.给方法定义一个别名。
2.重定义这个方法。
3.在新的方法中调用老的方法。

你可能感兴趣的:(Ruby元编程笔记——4.类定义)