28.熟悉ruby模块和类的钩子方法

29.在类的钩子方法中执行super方法

30.推荐使用define method而非 method missing

31.了解不同类型的eval间的差异

32.慎用猴子补丁

33.使用别名链执行被修改的方法

34.支持多种proc参数数量

35.使用模块前置时请谨慎思考

28.熟悉ruby模块和类的钩子方法

在terminology中的回调方法和集合章节的Forwardable中有提到完整的概念内容阐述。

29.在类的钩子方法中执行super方法

使用模块的方式来执行钩子方法,在下面的代码中,Simulate中的inherited方法如果没有super方法,直接返回[Son],如果有super方法,返回[Son]的同时,也执行“hello world”,即执行了被单例类的父类的方法。

module Demo
  def inherited(subclass)
    puts "hello world"
  end
end

class Simulate
  extend Demo

  def self.inherited(subclass)
    #super
    handlers << subclass
  end

  def self.handlers
    @handlers ||= []
  end

  def self.get_handlers
    @handlers
  end

  private_class_method :handlers
end

class Son < Simulate
end

p Simulate.get_handlers

已ActiveModel::Validations模块为例,当你包含这个模块时,它会创建一个inherited钩子方法并把父类中所有关于属性验证方法都复制到子类中,所以当包含这个模块的类执行inherited方法时候,需要调用super关键词。

30.推荐使用define method而非 method missing

31.了解不同类型的eval间的差异

见方法eval的使用

32.慎用猴子补丁

见元编程中的refine和using方法。

33.使用别名链执行被修改的方法

见方法alias

34.支持多种proc参数数量

35.使用模块前置时请谨慎思考

这个章节是介绍prepend的用法,其中prepend的钩子方法prepended已经在钩子方法中做了介绍,prepend和include的区别已经在元编程的Object章节做了介绍。

results matching ""

    No results matching ""