`
Hooopo
  • 浏览: 335360 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

reduce method missing call stack with dynamic define method

    博客分类:
  • Ruby
阅读更多
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次数。
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
分享到:
评论
5 楼 Hooopo 2011-07-02  
A  trick to reduce the number of calls to method_missing from tenderlove:
http://tenderlovemaking.com/2011/06/28/til-its-ok-to-return-nil-from-to_ary/
4 楼 orcl_zhang 2011-06-10  
Hooopo 写道
orcl_zhang 写道
这个会不会覆盖掉其他方法?
而且会增加很多无用的方法吧。

1.当然不会。。因为是在methodmissing执行时候才能定义方法的
比如A.new.find_by_name("Hooopo"),执行过程是这样的:
第一次执行:这个方法不存在->执行method missing->定义方法find_by_name
第二次执行:直接调用find_by_name

2.拿find_by_database_colum这个需求来说,数据库字段个数是有限的。需要使用find by的场景更是有限的,一般就是find by id/name/uid等


哦,看错了。。
想成(:define_method, name)了。。

chloerei 写道
Metaprogramming Ruby 里面也用了这个例子 http://book.douban.com/subject/4086938/ 好书

 
3 楼 chloerei 2011-06-10  
Metaprogramming Ruby 里面也用了这个例子 http://book.douban.com/subject/4086938/ 好书
2 楼 Hooopo 2011-06-10  
orcl_zhang 写道
这个会不会覆盖掉其他方法?
而且会增加很多无用的方法吧。

1.当然不会。。因为是在methodmissing执行时候才能定义方法的
比如A.new.find_by_name("Hooopo"),执行过程是这样的:
第一次执行:这个方法不存在->执行method missing->定义方法find_by_name
第二次执行:直接调用find_by_name

2.拿find_by_database_colum这个需求来说,数据库字段个数是有限的。需要使用find by的场景更是有限的,一般就是find by id/name/uid等

1 楼 orcl_zhang 2011-06-10  
这个会不会覆盖掉其他方法?
而且会增加很多无用的方法吧。

相关推荐

    Android下各语言加callStack示例

    在Android系统中,理解和分析调用堆栈(call stack)对于开发者来说至关重要,尤其是在调试和性能优化时。本文将深入探讨如何在Android环境下为不同语言(C语言、C++、Java以及内核空间)添加并打印调用堆栈信息。 ...

    android callstack.cpp

    android开发,打印调用栈 ,callstack.cpp,android开发,打印调用栈,android开发,打印调用栈

    trace call stack demo

    一个简单的打印程序调用栈的例子 .... <br>http://topic.csdn.net/u/20080804/15/623a4355-cfeb-4241-8fba-022fff8facf4.html

    callstack.h

    android开发,打印调用栈

    前端开源库-eslint-config-callstack-io

    **前端开源库-eslint-config-callstack-io** 在前端开发领域,保持代码质量和一致性是至关重要的。`eslint-config-callstack-io` 是一个开源库,专门用于帮助开发者实现这一目标。它提供了预设的 ESLint 配置,结合...

    android java CPP的callstack打印

    android java CPP的callstack函数回调打印,将文档的代码植入系统就可以。分别介绍了基于java 和 CPP的linux底层call back

    adroid开发打dump stack。

    在android上logd logv 时,看不到函数堆栈。 把这个函数加进去。ok。。 好用就顶 usage: ... #include "CallStack.h" ... mycallstack::CallStack calStk; calStk.update(2); calStk.dump(); ...

    memleak_callstack_ok

    标题“memleak_callstack_ok”暗示我们正在讨论一个针对Android项目解决内存泄漏问题的方案。内存泄漏在软件开发中是一个严重的问题,尤其是在资源有限的移动设备上,如Android手机和平板。它会导致应用程序占用...

    crypto-js 微信小程序加密

    小程序开发 crypto-js 报错 加密 解密 maximum call stack size exceeded

    Java反射之Call stack introspection详解

    Java反射之Call Stack Introspection是Java编程中的一个重要特性,它允许程序在运行时检查自身的方法调用堆栈。在Java中,每个线程都有自己的调用栈,用于存储方法调用的信息。栈帧(StackTraceElement)是这个调用...

    sytwologinpage.zip

    用Android Studio实现一个简单的登录界面 1.启动Android Studio并创建一个名为sytwologinpage的新项目。 2.打开res\layout目录下的activity_main.xml布局文件。 ... 3.打开src/ayoutexample包下的MainActivity.java文件...

    Hands-On Full-Stack Development with Swift epub

    Hands-On Full-Stack Development with Swift 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书

    eslint-config-callstack:ESLint预设扩展了Flow,Pettier和Jest

    @ callstack / eslint-config 用于React Native,React和Node.js项目的Callstack ESLint配置,使用Flow,TypeScript,Prettier和Jest以及合理的默认值。安装使用纱线:yarn add --dev eslint @callstack/eslint-...

    magento-callstack:Magento 的调用堆栈调试

    Mage :: helper ( 'stack/callstack' )-> toFirePhp (); Mage :: helper ( 'stack/callstack' )-> toLog (); 示例输出 .../app/code/community/Timbroder/Stack/Helper/Callstack....

    call-stack:节点调用堆栈抽象实际上很好

    提供易于使用的CallStack抽象,可用于代码反射。 笔记 使用 kuebk/node-stack 作为可选依赖项:这个 dep 可以访问 v8::StackTrace。 如果该依赖项不存在,请使用 Error 进行自省。 每个堆栈帧都应该有一些信息: ...

    callStackAnalysis

    This document describes how to analyze and retrieve the call stack for an executing program written in C or C++. The process can be quite complicated because of the unique features of certain ...

    stack_and_queue_with_max.cpp

    本源码实现了两个类,一个是带有最大值的栈和一个是带有最大值的队列。栈利用了两个C++的stack,队列利用了C++的queue。

    Hands-On Full-Stack Development with Swift-Packt Publishing(2018).epub

    Using Vapor, we will build a full-stack web application that will act as an API server for our iOS and tvOS app, and will also be our web server, which will render a web view of our app. Several ...

Global site tag (gtag.js) - Google Analytics