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章节做了介绍。