ruby元编程第二版 学习 - 当前类

15年某次写代码时发现类的instance_eval 里 用 define_method 定义的不是实例方法,而是类方法;当时查了下资料,了解到当前类https://www.jianshu.com/p/xqbKUX(当时说随后查下当前类的用法,然而三年过去了..。鄙视下自己!),但一直不太清晰;最近看了ruby元编程第二版,当前类基本弄明白了。

不管处在ruby程序的哪个位置,总存在一个当前对象:self。同样,也总是有一个当前类(或模块)存在。定义一个方法时,那个方法将成为当前类的一个实例方法。
我们可以用self获取当前对象,但是ruby并没有相应的的方式来获取当前类的引用。不过,跟踪当前类并不困难,我们可以查看源代码。

  • 在程序的顶层,当前类是Object,这是main对象所属的类。(这就是你再顶层定义方法会成为Object实力对象的原因。)
  • 在一个方法中,当前类就是当前对象的类。(试着在一个方法中用def 关键字定义另一个方法,你会发现这个新方法会定义在self所属的类中。)
class C
  def m1
    def m2;end
  end
end
C.instance_methods(false) #[:m1,:2]
  • 当用class关键字打开一个类时(或者用module关键字打开模块时),那个类称为当前类。

当前类只影响def 定义的方法归属(截止目前的认知)

def定义的方式是当前类的实例方法

已知有三种方法改变当前类

  • class 打开类,修改当前类为打开的类
  • class_eval修改当前类为调用者
  • instance_eval 修改当前类为调用者的enginclass(这就是为什么A.instance_eval里用def定义的是A的类方法:定义的是A的enginclass的实例方法,这就是类方法,或者说单件方法)

你可能感兴趣的:(ruby元编程第二版 学习 - 当前类)