`

ruby处理未定义的方法

    博客分类:
  • ruby
阅读更多
关于未定义的方法,《ruby编程语言》上面说得比较詳細了,所以先引用一下:
引用

  当方法名解析算法无法找到一个方法时,它会转而去寻找一个名为method_missing的方法。当此方法被调用时,它的第一个参数是一个符号,表示无法找到的方法的名字,后面的参数都是传给本来该找到的方法的。如果在进行方法调用时附带了一个代码块,则这个代码块也会被 传递给找到的方法或method_missing。
  在kernel模块中,method_missing的默认实现不过是简单的抛出一个NoMethodError异常。如果不对这个异常进行捕获,程序将在给出一个错误消息后退出。这也是通常在调用一个不存在的方法后所期望的結果。
  为一个类定制自己的method_missing方法使你有机会处理该类实例上的任何方法调用。method_missing钩子是Ruby动态机制中最强大的工具之一,它常常被用于元编程技术。
为Hash类增加一个method_missing方法,使我们可以像方法一样对某个主键的值进行查询或设置
class Hash
  # Allow hash values to be queried and set as if they were attributes.
  # We simulate attribute getters and setters for any key.
  def method_missing(key, *args)
    text = key.to_s

    if text[-1,1] == "="               # If key ends with = set a value
      self[text.chop.to_sym] = args[0] # Strip = from key
    else                               # Otherwise...
      self[key]                        # ...just return the key value
    end
  end
end

h = {}         # Create an empty hash object
h.one = 1      # Same as h[:one] = 1
puts h.one     # Prints 1. Same as puts h[:one]



上面这段引用讲得比较清楚了,而上面这段代码的作用就是粗体部分所说的那样,针对上面代码,参数key的值为"one=",而args则是代表等号后的内容。
  之所以想关注一下这个,是因为最近看了下camping的源代码,下面的代码与上面的例子的作用相似,不过更精简:
class H < Hash
    def method_missing(m,*a)
        m.to_s=~/=$/?self[$`]=a[0]:self[m.to_s]
    end
  end

其中=~是模式匹配符,$'表示匹配以前的字符,在此文中就是等号前的内容。当然这段代码是自己改了一下,原文直接是下面这样的:
class H < Hash
    def method_missing(m,*a)
        m.to_s=~/=$/?self[$`]=a[0]:a==[]?self[m.to_s]:super
    end
    undef id, type if ?? == 63
end

暂时没看懂那个super有什么特别的用处,因为既然是继承关系,当然可以访问父类中的方法,除非是private方法,当然下面那句代码中有??这个东西,俺也不明白到底有什么深意。
具体讨论见:
http://www.iteye.com/post/1700339
分享到:
评论

相关推荐

    Ruby元编程pdf

    `method_missing`是Ruby的一个特殊方法,当调用一个未定义的方法时,系统会自动调用它,允许开发者处理未知的方法调用。 3. **变量**:Ruby的变量可以在运行时被重新定义。全局变量、实例变量和类变量都可以动态...

    元编程 Ruby

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

    Ruby Ini文件读写

    在处理INI文件时,可能会遇到一些问题,如无效的语法、未定义的节或选项等。`configparser`库通常会抛出异常来处理这些问题。当你遇到这些问题时,需要通过`begin-rescue-end`块捕获并处理异常,确保程序的健壮性。...

    Ruby语言中文教程

    通过这个中文教程,你将掌握Ruby语言的基础知识,包括语法、对象系统、控制结构、数据结构、类和模块、异常处理、方法与闭包以及元编程。同时,了解Ruby的生态系统,能够利用Gem管理和使用社区的资源,提升开发效率...

    ruby2.6.1.zip

    4. **安全的数组和哈希迭代**:为了防止某些类型的安全问题,Ruby 2.6.1提供了安全的数组和哈希迭代器,它们可以确保在迭代过程中不会因修改容器而导致未定义的行为。 5. **Symbol到Proc转换的改进**:在Ruby 2.6.1...

    ruby-2.7.0.tar.gz

    5. **性能提升**: Ruby 2.7对垃圾回收机制进行了优化,提升了整体运行速度,尤其是对于循环引用的处理。 6. **模块合并的改进**: 对于模块的合并操作,现在支持更灵活的控制,允许保留或覆盖已有方法,提高了代码...

    Ruby中文教程。。。

    2. 方法_missing:此方法允许自定义处理未定义的方法调用,提供了一种强大的错误处理和扩展机制。 四、Ruby on Rails框架 Ruby的流行很大程度上得益于Ruby on Rails框架,它是一个用于构建Web应用的全栈框架。...

    Metaprogramming ruby

    其中,`method_missing`是一个特殊的方法,用于处理未定义的方法调用,是实现动态行为的重要工具。 3. **符号到方法转换(Symbol#to_proc)**:Ruby允许将符号转换为块(Proc对象),这样可以更简洁地编写代码。...

    ruby 程序设计

    - **默认返回值**:Ruby方法的最后一句表达式的值即为方法的返回值。 - **显式返回值**:使用`return`关键字显式指定返回值。 #### 八、模块 ##### §8.1 名字空间 - **概念**:模块可以作为名字空间,避免名称...

    ruby基础学习资料

    例如,`method_missing`方法可以捕获未定义的方法调用,`send`方法允许动态调用方法。 学习这些基础后,你将能够编写简单的Ruby程序,理解面向对象编程的基本概念,并逐步探索更高级的主题,如元类、Gem包管理、...

    Ruby简明教程之方法(Method)介绍

    Ruby是一种强大的面向对象编程语言,它的...了解如何定义、调用和处理方法的返回值是成为熟练的Ruby程序员的基础。继续学习Ruby的其他关键概念,如数组、哈希、判断语句和循环语句,将有助于进一步提升你的编程技能。

    ruby语言

    6. **异常处理**:Ruby使用`begin/rescue/ensure/else`语句进行异常处理,可以捕获和处理运行时错误。 7. **闭包**:Ruby的块(block)和Proc、Lambda都是闭包,它们可以记住定义时的作用域,即使在其他地方调用也...

    Metaprogramming Ruby(Second Edition)

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

    Ruby Source Code

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

    Ruby程序设计

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

    ruby简单笔记

    当尝试调用一个不存在的方法时,Ruby会抛出`NoMethodError`异常,通常是因为方法未定义或拼写错误。然而,通过`undef_method`方法,可以在类中显式地删除一个已定义的方法,这在调试和运行时代码修改中非常有用。 #...

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

    当尝试调用一个未定义的方法时,`method_missing` 将会被触发,从而允许程序员自定义相应的处理逻辑。 #### 代码示例 ```ruby class DynamicMethods def method_missing(method_name, *args, &block) if method_...

    ruby语言基础

    `Class.new`和`Module.new`可用于创建新的类和模块,`method_missing`是常用的元编程技巧,用于处理未定义的方法调用。 11. **Gem**:Ruby的生态系统中,Gem是打包和分发代码的标准方式,它提供了安装、管理和更新...

    Ruby学习思维导图.pdf

    - **method_missing**:处理未定义的方法调用。 - **const_missing**:处理未定义的常量。 - **eval**:执行字符串形式的 Ruby 代码。 - **send**:动态调用对象的方法。 - **respond_to?**:检查对象是否响应某个...

    ruby中文文档

    7. **异常处理**:Ruby的异常处理使用begin..rescue..else..ensure结构,允许开发者优雅地处理程序运行时可能出现的问题。 8. **模块(Module)**:模块是命名空间管理工具,可以包含常量、方法和混合(mix-in)到...

Global site tag (gtag.js) - Google Analytics