关于未定义的方法,《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
分享到:
相关推荐
sys未定义的解决方法sys未定义的解决方法
IE11也支持html2canvas该插件 Promise 未定义 引用该脚本即可
方法应该定义Ruby的之前调用他们,否则会引发一个异常未定义的方法调用。 语法: def method_name [( [arg [= default]]...[, * arg [, &expr ]])] expr.. end 所以,可以定义一个简单的方法如下: def method_...
主要解决在单例模式下类中声明静态指针存储单例对象,在.cpp文件中编译时显示未定义的解决办法: 参考博客: http://bbs.csdn.net/topics/10439749
下面小编就为大家带来一篇完美解决IE9浏览器出现的对象未定义问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,祝大家游戏愉快哦
AjaxControlToolkit未定义
环境变量ORACLE_UNQNAME未定义问题
引入解决IE7及以下版本JSON未定义问题
解决.net4.5+解决WebForm_InitCallback() 未定义问题,直接在问题页面引用即可。
该模块提供了一些用于处理未定义对象属性的实用方法,因此,如果您厌倦了在使用上述方法格式化 JSON 时在代码库中多次编写或看到typeof x !== undefined时,该模块会派上用场。 用法: var defined = require ( '...
NULL 博文链接:https://ruohanfly.iteye.com/blog/2184028
QFtp 编译报错 使用了未定义类型“QFtpPrivate”的方法
excel提示用户定义类型未定义怎么办.docx
json2.js json.parse json未定义 的解决方案!
json2.js,官方版本(2014-02-04) ie6、ie7下JSON.parse JSON未定义的解决方法
主要介绍了vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
json2.js json.parse json未定义 的解决方案!
解决IE中JSON未定义的兼容问题
今天在使用Moodle的时候, 突然发现在IE下进入课件的时候提示”JSON 未定义”错误信息. ...以上就是小编为大家带来的JSON 对象未定义错误的解决方法的全部内容了,希望对大家有所帮助,多多支持软件开发网~