`

关于method_missing

 
阅读更多
10 things you should know about method_missing

1,method_missing是一个Ruby内核方法

2,Rails使用method_missing实现了一些最惊人的magic。当你请求Model的find_by_freaky_column_name方法时,Model会给予
响应,因为ActiveRecord::Base覆盖了内核的method_missing方法。

3,method_missing是方法调用的最后一道防线。当你发送消息到Ruby对象时,Ruby查询与消息同名的方法来调用(有许多方式来
发送消息,最常见的方式是obj.method_name,而你也可以使用obj.send(:method_name)来显示的调用方法)。首先它查询当前
self对象自己的实例方法,然后是该类引入的每个模块,并且是按引入模块的反序。然后它查询该类的父类以及父类引入的模块,
如此这般直到Object类。如果这样仍然找不到该方法,则最后去找的地方就是Object类里引入的Kernel模块,最后将调用的方法
就是method_mising。你可以在方法查询路径里的任何位置覆盖method_missing来告诉Ruby当找不到方法时干什么。

4,我们使用method_missing来实现一些默认行为,更多的是使用它来作为方法工厂或分配器。有时候我们想使用一个类或模块来
做一些同样的工作,我们不知道用户会调用哪个方法,而实现所有的方法看起来又太浪费了。有时候我们添加一个新方法到类中
(factory);有时候我们使用method_missing(dispatcher)。

5,method_missing是Ruby的一个特性,它让我们非常容易创建自己的DSL 。DSL为Domain Specific Language

6,这里是内核的method_missing实现 。它是用C写的,可以看到结果是NoMethodError。
Java代码  收藏代码
  1. irb(main):  "thingy" .invoke_method_missing_for_demo_purposes( "arg" "other arg" )  
  2. NoMethodError: undefined method 'invoke_method_missing_for_demo_purposes'   for   "thingy" :String from (irb): 227   


7,这里 Jamic Buck为我们展示了ActiveRecord::Base怎样覆盖method_missing。

8,method_missing据说比直接调用已经存在的方法慢,确实是这样,因为它是在Ruby查询所有地方后才调用。不过这并不影响使用。

9,method_missing可能对使用你的代码的用户有点不透明,因为动态创建的方法不会有API文档。

10,使用method_missing是Ruby元编程的一个大特性,元编程对其他语言(如Java)开发者而言不是常见的。在method_missing的讨论
中说道:“我不认为元编程在这里是为了节省内存或提高速度。元编程后面的哲学是告诉Ruby你的惯例并让它作一些猜测,以达到节省你的代码的目的。”
分享到:
评论

相关推荐

    Ruby元编程之梦中情人method_missing方法详解

    Ruby中的`method_missing`是元编程的一个核心特性,它允许你在类或模块中处理未定义的方法调用。当你尝试调用一个不存在的方法时,Ruby会默认抛出`NoMethodError`异常,但如果你定义了`method_missing`方法,它就会...

    ruby元编程之method_missing的一个使用细节

    ### Ruby元编程之method_missing的一个使用细节 #### 引言 在Ruby语言中,元编程是一种非常强大的功能,它允许程序在运行时修改自身的行为。其中`method_missing`方法是元编程的重要组成部分之一,用于处理未知的...

    method_not_missing:因为露比

    gem install method_not_missing 外部依赖 PhantomJS(在OSX上brew install phantomjs ) 例子 require "method_not_missing" object = MethodNotMissing :: OmnipotentObject . new object . update ( [ 3 ] ) ## ...

    kp method for optical calculation.rar_missing1rq_价带导带_量子光学_量子计算_

    本代码是个人编写的计算GaN量子阱内导带,价带(6*6哈密顿量)的光学特性,包含光吸收,光增益,量子效率,波函数,计算包含导带-价带,导带-导带,价带-价带内部的跃迁的所有计算,使计算量子体系的光吸收的理想...

    method_R语言_

    在R中,可以编写如`method.R`这样的脚本,导入数据,应用上述插补方法,然后进行比较。例如,首先加载数据,然后应用`mice`库的`mice()`函数进行多重插补,接着使用`predict()`函数对缺失值进行预测,并通过比较...

    JAD解决MISSING_BLOCK_LABEL心得

    当有try-catch-finally语句的时候会提示信息“Couldn't resolve all exception handlers in method ” 4. Currently Jad ignores the contents of the Line Number Table Attribute and the Source File Attribute...

    ruby元编程之创建自己的动态方法

    本文将深入探讨如何利用`method_missing`和`respond_to?`来创建动态方法,这是一种在Ruby社区中广泛使用的技巧,尤其是在诸如Rails这样的框架中。 #### 二、`method_missing`详解 `method_missing`是Ruby中的一个...

    looksee:IRB中的增压方法自省

    __id__ initialize method_missing singleton_method_undefined != __send__ instance_eval singleton_method_added == equal? instance_exec singleton_method_removed Kernel !~ enum_for

    编程之魂:Ruby中的元编程艺术

    def method_missing(method_name, *args, &block) if method_name.to_s.start_with?("get_") attribute_name = method_name.to_s[4..-1] puts "Fetching #{attribute_name}" @attributes[attribute_name] else...

    MetaProgramming-Play:重写 Ruby 注入方法以了解元编程

    第 10 周:创客学院在 Ruby 中玩转元编程挑战: 使用method_missing重新定义对象在询问has_unknown_attribute时的Reacthas_unknown_attribute 。 使用define_method创建Ruby 内置attr_accessor方法的布尔版本。代码...

    intro_to_metaprogramming:Ruby元编程简介

    使用send , define_method和method_missing遍历不同的元编程技术 将您的思维扩展到元编程,并让您考虑可以在自己的代码中利用它的地方 设置 要求 该讲习班是使用Ruby 1.9.3创建的,但是在2.1.2版本中有效。 假设您...

    Ruby元编程的一些值得注意的地方

    如果误用了`method_missing`,可能会导致程序中的方法调用出现异常,甚至引发安全问题。因此,在可能的情况下,应优先考虑使用`delegate`或`define_method`来实现动态方法调用。 #### 九、捕捉定义良好的方法 在...

    Metaprogramming ruby

    2. **方法定义和调用**:Ruby支持多种方法定义方式,如`def`关键字、`define_method`、`method_missing`等。其中,`method_missing`是一个特殊的方法,用于处理未定义的方法调用,是实现动态行为的重要工具。 3. **...

    flickr_party:Flickr API 的包装器,具有真正的应用程序身份验证,使用 HTTParty

    我们建立在 HTTParty 之上,并做了一些method_missing魔法来接受官方 Flickr API 支持的任何方法。 您还可以(可选)使用auth_url和complete_auth方法(见下文)进行经过身份验证的 API 调用。 安装 gem install ...

    manavolt:是时候参加黑客马拉松了! 伏特风格!

    attributes, :method_missing, :assign_attribute, :read_attribute, :read_new_model, :new_model , :new_array_model, :expand!, :<<, :save!, :promise_for_errors, :buffer, :state,

    queryable_array:提供简化的 DSL,允许按属性搜索对象数组

    它覆盖[] 、 find_all和method_missing以提供一种简化的 DSL,用于通过查询对象的属性来查找对象。 在查看完整文档。 安装 gem install queryable_array 要求 Ruby 1.9+ 用法 基本¶ ↑ 使用一组对象初始化...

    ruby元编程.pdf

    7. 调用者方法(Method Missing):Ruby提供了一个特殊的叫做 `method_missing` 的方法。当一个对象接收到一个未定义的方法调用时,Ruby会尝试调用 `method_missing`。利用这一点,程序员可以创建出非常有表现力的...

Global site tag (gtag.js) - Google Analytics