关于未定义的方法,《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
分享到:
相关推荐
`method_missing`是Ruby的一个特殊方法,当调用一个未定义的方法时,系统会自动调用它,允许开发者处理未知的方法调用。 3. **变量**:Ruby的变量可以在运行时被重新定义。全局变量、实例变量和类变量都可以动态...
2. 方法拦截:Ruby提供了method_missing方法,它允许我们拦截对当前对象中未定义方法的调用,并进行自定义处理。 3. 模块混入:Ruby中的模块可以被包含(include)到类中,这在本质上是把模块中的方法和类混合,...
在处理INI文件时,可能会遇到一些问题,如无效的语法、未定义的节或选项等。`configparser`库通常会抛出异常来处理这些问题。当你遇到这些问题时,需要通过`begin-rescue-end`块捕获并处理异常,确保程序的健壮性。...
通过这个中文教程,你将掌握Ruby语言的基础知识,包括语法、对象系统、控制结构、数据结构、类和模块、异常处理、方法与闭包以及元编程。同时,了解Ruby的生态系统,能够利用Gem管理和使用社区的资源,提升开发效率...
4. **安全的数组和哈希迭代**:为了防止某些类型的安全问题,Ruby 2.6.1提供了安全的数组和哈希迭代器,它们可以确保在迭代过程中不会因修改容器而导致未定义的行为。 5. **Symbol到Proc转换的改进**:在Ruby 2.6.1...
5. **性能提升**: Ruby 2.7对垃圾回收机制进行了优化,提升了整体运行速度,尤其是对于循环引用的处理。 6. **模块合并的改进**: 对于模块的合并操作,现在支持更灵活的控制,允许保留或覆盖已有方法,提高了代码...
2. 方法_missing:此方法允许自定义处理未定义的方法调用,提供了一种强大的错误处理和扩展机制。 四、Ruby on Rails框架 Ruby的流行很大程度上得益于Ruby on Rails框架,它是一个用于构建Web应用的全栈框架。...
其中,`method_missing`是一个特殊的方法,用于处理未定义的方法调用,是实现动态行为的重要工具。 3. **符号到方法转换(Symbol#to_proc)**:Ruby允许将符号转换为块(Proc对象),这样可以更简洁地编写代码。...
- **默认返回值**:Ruby方法的最后一句表达式的值即为方法的返回值。 - **显式返回值**:使用`return`关键字显式指定返回值。 #### 八、模块 ##### §8.1 名字空间 - **概念**:模块可以作为名字空间,避免名称...
例如,`method_missing`方法可以捕获未定义的方法调用,`send`方法允许动态调用方法。 学习这些基础后,你将能够编写简单的Ruby程序,理解面向对象编程的基本概念,并逐步探索更高级的主题,如元类、Gem包管理、...
Ruby是一种强大的面向对象编程语言,它的...了解如何定义、调用和处理方法的返回值是成为熟练的Ruby程序员的基础。继续学习Ruby的其他关键概念,如数组、哈希、判断语句和循环语句,将有助于进一步提升你的编程技能。
6. **异常处理**:Ruby使用`begin/rescue/ensure/else`语句进行异常处理,可以捕获和处理运行时错误。 7. **闭包**:Ruby的块(block)和Proc、Lambda都是闭包,它们可以记住定义时的作用域,即使在其他地方调用也...
通过`method_missing`方法,你可以捕获并处理未定义的方法调用,实现动态行为。 2. **类和模块**:Ruby的类和模块是元编程的基础。类可以作为工厂来创建对象,模块用于组织代码和提供单继承外的多重继承功能。`...
例如,`method_missing`方法允许你在类中处理未定义的方法调用,`send`方法可以动态调用方法,`class 用于进入类的元类进行定义。 5. **Gem包管理**:Ruby的Gem系统是其生态系统的重要组成部分,它提供了大量的库和...
`class_eval`和`instance_eval`方法可以在运行时添加方法,`method_missing`方法可以捕获未定义的方法调用。 了解并熟练掌握以上知识点是成为Ruby程序员的基础。Ruby的灵活性和强大功能使其在很多领域都有应用,如...
当尝试调用一个不存在的方法时,Ruby会抛出`NoMethodError`异常,通常是因为方法未定义或拼写错误。然而,通过`undef_method`方法,可以在类中显式地删除一个已定义的方法,这在调试和运行时代码修改中非常有用。 #...
当尝试调用一个未定义的方法时,`method_missing` 将会被触发,从而允许程序员自定义相应的处理逻辑。 #### 代码示例 ```ruby class DynamicMethods def method_missing(method_name, *args, &block) if method_...
`Class.new`和`Module.new`可用于创建新的类和模块,`method_missing`是常用的元编程技巧,用于处理未定义的方法调用。 11. **Gem**:Ruby的生态系统中,Gem是打包和分发代码的标准方式,它提供了安装、管理和更新...
- **method_missing**:处理未定义的方法调用。 - **const_missing**:处理未定义的常量。 - **eval**:执行字符串形式的 Ruby 代码。 - **send**:动态调用对象的方法。 - **respond_to?**:检查对象是否响应某个...
7. **异常处理**:Ruby的异常处理使用begin..rescue..else..ensure结构,允许开发者优雅地处理程序运行时可能出现的问题。 8. **模块(Module)**:模块是命名空间管理工具,可以包含常量、方法和混合(mix-in)到...