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你的惯例并让它作一些猜测,以达到节省你的代码的目的。”
相关推荐
Ruby中的`method_missing`是元编程的一个核心特性,它允许你在类或模块中处理未定义的方法调用。当你尝试调用一个不存在的方法时,Ruby会默认抛出`NoMethodError`异常,但如果你定义了`method_missing`方法,它就会...
### Ruby元编程之method_missing的一个使用细节 #### 引言 在Ruby语言中,元编程是一种非常强大的功能,它允许程序在运行时修改自身的行为。其中`method_missing`方法是元编程的重要组成部分之一,用于处理未知的...
gem install method_not_missing 外部依赖 PhantomJS(在OSX上brew install phantomjs ) 例子 require "method_not_missing" object = MethodNotMissing :: OmnipotentObject . new object . update ( [ 3 ] ) ## ...
本代码是个人编写的计算GaN量子阱内导带,价带(6*6哈密顿量)的光学特性,包含光吸收,光增益,量子效率,波函数,计算包含导带-价带,导带-导带,价带-价带内部的跃迁的所有计算,使计算量子体系的光吸收的理想...
在R中,可以编写如`method.R`这样的脚本,导入数据,应用上述插补方法,然后进行比较。例如,首先加载数据,然后应用`mice`库的`mice()`函数进行多重插补,接着使用`predict()`函数对缺失值进行预测,并通过比较...
当有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...
本文将深入探讨如何利用`method_missing`和`respond_to?`来创建动态方法,这是一种在Ruby社区中广泛使用的技巧,尤其是在诸如Rails这样的框架中。 #### 二、`method_missing`详解 `method_missing`是Ruby中的一个...
__id__ initialize method_missing singleton_method_undefined != __send__ instance_eval singleton_method_added == equal? instance_exec singleton_method_removed Kernel !~ enum_for
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...
第 10 周:创客学院在 Ruby 中玩转元编程挑战: 使用method_missing重新定义对象在询问has_unknown_attribute时的Reacthas_unknown_attribute 。 使用define_method创建Ruby 内置attr_accessor方法的布尔版本。代码...
使用send , define_method和method_missing遍历不同的元编程技术 将您的思维扩展到元编程,并让您考虑可以在自己的代码中利用它的地方 设置 要求 该讲习班是使用Ruby 1.9.3创建的,但是在2.1.2版本中有效。 假设您...
如果误用了`method_missing`,可能会导致程序中的方法调用出现异常,甚至引发安全问题。因此,在可能的情况下,应优先考虑使用`delegate`或`define_method`来实现动态方法调用。 #### 九、捕捉定义良好的方法 在...
2. **方法定义和调用**:Ruby支持多种方法定义方式,如`def`关键字、`define_method`、`method_missing`等。其中,`method_missing`是一个特殊的方法,用于处理未定义的方法调用,是实现动态行为的重要工具。 3. **...
我们建立在 HTTParty 之上,并做了一些method_missing魔法来接受官方 Flickr API 支持的任何方法。 您还可以(可选)使用auth_url和complete_auth方法(见下文)进行经过身份验证的 API 调用。 安装 gem install ...
attributes, :method_missing, :assign_attribute, :read_attribute, :read_new_model, :new_model , :new_array_model, :expand!, :<<, :save!, :promise_for_errors, :buffer, :state,
它覆盖[] 、 find_all和method_missing以提供一种简化的 DSL,用于通过查询对象的属性来查找对象。 在查看完整文档。 安装 gem install queryable_array 要求 Ruby 1.9+ 用法 基本¶ ↑ 使用一组对象初始化...
7. 调用者方法(Method Missing):Ruby提供了一个特殊的叫做 `method_missing` 的方法。当一个对象接收到一个未定义的方法调用时,Ruby会尝试调用 `method_missing`。利用这一点,程序员可以创建出非常有表现力的...