reduce method missing call stack with dynamic define method
程序员文章站
2022-07-04 18:38:57
...
method_missing是ruby里面一个非常cool的hook。rails里面很多特性都是基于method missing实现的。
但是method missing也不是那么完美。各种rails性能优化的文章都建议避免使用method missing,原因很简单,method missing的实现机制确实会是增加call ruby stack次数。
使用method missing + define method,调用一次method missing后动态定义方法来减少call ruby stack次数。
输出:
rails里的find by和动态属性都是这样实现的:
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_methods.rb
但是method missing也不是那么完美。各种rails性能优化的文章都建议避免使用method missing,原因很简单,method missing的实现机制确实会是增加call ruby stack次数。
使用method missing + define method,调用一次method missing后动态定义方法来减少call ruby stack次数。
class A def method_missing(method_id, *args) puts "method missing stack called.." if method_id.to_s =~ /^find_by_(.*?)$/ name = $1 self.class.send(:define_method, method_id) do name end send(method_id, *args) else super end end end obj = A.new p obj.find_by_title p obj.find_by_title
输出:
method missing stack called.. "title" "title" #第二次没有执行method missing方法..
rails里的find by和动态属性都是这样实现的:
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_methods.rb
下一篇: 最轻量级的Ruby后台任务