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

method_missing了解10件事

    博客分类:
  • Ruby
阅读更多
我可不是标题党,题目是原作者起的
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。
irb(main): "thingy".invoke_method_missing_for_demo_purposes("arg", "other arg")
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你的惯例并让它作一些猜测,以达到节省你的代码的目的。”
分享到:
评论
2 楼 fkpwolf 2007-08-07  
当时学习activerecord的时候就感觉到这个方法的强大:数据库表的pojo居然是个空的类。后来发现一切都是不过如此的一个方法。
不好的地方,我觉得,就是程序的接口没了,就像在java中我比较讨厌反射一样。静态检查没了。
当然了,数据库table的pojo的接口是没多大意义的。
1 楼 jack 2007-08-04  
我很喜欢这个 函数 。 method_missing里面写代码,调用的适合,的确是很有dsl的感觉

相关推荐

    编程之魂: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元编程.pdf

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

    video-access-api:用于访问视频元数据信息的API

    了解有关method_missing用于动态范围的更多信息 了解有关更多信息 视频元数据访问API 用于访问视频元数据信息的API。 您可以在找到数据库的架构设计 视频方法 输出格式为JSON。 POST api /视频 添加新的视频条目。 ...

    ruby metaprogramming examples

    1. 方法动态定义(Method Missing):Ruby允许通过定义一个`method_missing`方法来拦截对未知方法的调用。这意味着你可以在运行时根据需要创建和响应方法调用。 2. 动态方法定义:Ruby提供了一些内置方法,如`...

    脚本编程之: ruby_bcyy_jb51.net

    6. **元编程**:Ruby的元编程特性,如`class_eval`、`instance_eval`、`method_missing`等,以及如何利用它们来增强代码的动态性。 7. **测试驱动开发(TDD)**:Ruby社区非常注重TDD,因此可能包含关于Rspec或Test::...

    Ruby程序设计

    `class_eval`和`instance_eval`方法可以在运行时添加方法,`method_missing`方法可以捕获未定义的方法调用。 了解并熟练掌握以上知识点是成为Ruby程序员的基础。Ruby的灵活性和强大功能使其在很多领域都有应用,如...

    ruby官方chm文档

    理解如何使用`eval`、`class_eval`和`instance_eval`,以及如何利用`send`和`method_missing`进行消息传递,是提升Ruby编程技巧的关键。 《ruby23.chm》文档可能是整个Ruby语言的综合指南,可能包含前面几个文档的...

    Metaprogramming Ruby(Second Edition)

    通过`method_missing`方法,你可以捕获并处理未定义的方法调用,实现动态行为。 2. **类和模块**:Ruby的类和模块是元编程的基础。类可以作为工厂来创建对象,模块用于组织代码和提供单继承外的多重继承功能。`...

    Handling-Missing-Data-Values-using-Pandas

    total_missing = missing_data.sum() ``` 3. **删除缺失值**:有时,最简单的处理策略是直接删除包含缺失值的行或列。使用`dropna()`函数可以实现这一目标,`axis=0`代表按行删除,`axis=1`代表按列删除。 ```...

    ruby中文文档 chm版

    这通过反射(reflection)和动态方法定义(method_missing)等机制实现,极大地增强了代码的灵活性和可扩展性。 `chm`文件是一种Windows平台下的帮助文件格式,全称为“Microsoft Compiled HTML Help”。这种文件将...

    Beginning Ruby From Novice to Professional 2nd Edition.pdf

    此外,书中还会介绍Ruby的元编程能力,如`send`方法和`method_missing`,这使得Ruby在运行时可以修改自身的行为。 在“专业开发者”的部分,作者会讲解如何使用Ruby的标准库和第三方gem(Ruby的库包管理器),例如...

    Ruby 编程

    元类(metaclass)和`method_missing`方法是实现元编程的关键工具,它们允许动态添加方法和属性,甚至在运行时改变对象的行为。 在学习Ruby时,还应了解其标准库,如`Net::HTTP`用于网络请求,`JSON`库用于解析和...

    元编程 Ruby

    2. 方法拦截:Ruby提供了method_missing方法,它允许我们拦截对当前对象中未定义方法的调用,并进行自定义处理。 3. 模块混入:Ruby中的模块可以被包含(include)到类中,这在本质上是把模块中的方法和类混合,...

    ruby中文教程,从基础到深入的让你学习ruby

    此外,Ruby的`send`方法可以动态调用方法,`method_missing`可以捕获未定义的方法调用。 Ruby的Gem库是其生态系统的一大亮点,提供大量的第三方库和框架,如Rails(一个流行的Web开发框架)、Sinatra(轻量级Web...

    Ruby中文文档.rar

    - `define_method`和`method_missing`:前者用于在运行时定义方法,后者是当尝试调用一个不存在的方法时的回调,常用于实现自定义错误处理或动态行为。 4. **模块(Module)**: - 模块用于封装相关的方法和常量...

    ruby中文文档

    `class 用于自定义类的实例方法,`method_missing`可以捕捉未定义的方法调用。 11. **标准库和Gem**:Ruby有一个庞大的标准库,包含了各种常用功能。此外,Ruby的生态系统中有无数的Gem(第三方库),如...

    Ruby Source Code

    例如,`method_missing`方法允许你在类中处理未定义的方法调用,`send`方法可以动态调用方法,`class 用于进入类的元类进行定义。 5. **Gem包管理**:Ruby的Gem系统是其生态系统的重要组成部分,它提供了大量的库和...

Global site tag (gtag.js) - Google Analytics