==回调方法和钩子方法
回调和钩子是相当常见的元编程技术。在Ruby程序运行过程中,当特定的事件发生时,将调用这些回调和钩子方法。特定事件是指:
* 调用一个不存的对象方法
* 类混含一个模块
* 定义类的子类
* 给类添加一个实例方法
* 给对象添加一个单例方法
* 引用一个不存在的常量
以上的每个事件,都可以编写一个回调方法,在该事件发生时,该回调方法被执行。这些回调方法是针对某个对象或某个类的,而不是全局的。
===method_missing
给对象调用一个方法,对象没有这个方法时,则会抛出NoMethodError异常,这时就可以使用method_missing来拦截。
class C
def method_missing(m)
puts "There's no method called #{m} here -- please try again."
end
end
C.new.anything
这里就会调用method_missing方法。
method_missing是一个有用的工具,在所有Ruby标准的钩子方法和回调方法中,它可能是使用最广泛的了。
===Module#included
当一个模块混入到类时,如果该模的included方法已经定义,那么该方法被调用。该方法的唯一参数就是接受混含的类的名字。
module M
def self.included(c)
puts "I have justbeen mixed into #{c}."
end
end
class C
include M
end
混含模块到类中使得在模块中的所有实例方法可以被作为类的实例的方法。如果在混含模块时,不仅要给类添加实例方法,还要添加类方法,该如何做呢?
用included可以捕获混含操作,并以此给混含模块的类添加类方法:
module M
def self.included(cl)
def cl.a_class_method
puts "Now the class has a new class method."
end
end
def an_inst_method
puts "This module supplines this instance method."
end
end
class C
include M
end
c = C.new
c.an_inst_method
C.a_class_method
输出结果:
This module supplines this instance method.
Now the class has a new class method.
其实这里很好理解,由于C做为included的唯一参数传入到cl,接着定义了cl.a_class_method就相当于是给类C定义了类方法。
===Class#inherited
如果为给定的类定义了inherited方法,那么在为它生成子类时,inherited会被调用,唯一的调用参数是新的子类的名字:
class C
def self.inherited(subclass)
puts "#{self} just got subclassed by #{subclass}"
end
end
class D < C
end
D继承C,触发了inherited方法,输出结果:
C just got subclassed by D
===Module#const_missing
在给定的模块或类中引用一个不可识别的常量时,该方法被调用:
class C
def self.const_missing(const)
puts "#{const} is undefined-setting it to 1."
const_set(const, 1)
end
end
puts C::A
puts C::A
输出结果:
A is undefined-setting it to 1.
1
1
分享到:
相关推荐
带有Ruby回调的通用钩子。 介绍 挂钩允许您在Ruby类中声明性地定义挂钩。 您可以将回调添加到您的钩子中,该回调将在您运行钩子后立即运行! 几乎就像ActiveSupport :: Callbacks,但复杂度降低了76.6%。 相反,它...
钩子方法有些类似事件驱动装置,可以在特定的事件发生后执行特定的回调函数,这个回调函数就是钩子方法(更形象的描述: 钩子方法可以像钩子一样,勾住一个特定的事件。),在Rails中before\after函数就是最常见的钩子...
钩子方法能够极大地提升程序的可扩展性和灵活性。 1. 类与模块相关的钩子方法: - `Class#inherited`: 当一个类被其他类继承时,这个方法会在子类被创建时自动调用。 - `Module#include`: 当一个模块被包含到类中...
在ruby代码中,其实我们一直都在进行元编程,虽然可能只是一句非常简单的代码,比如说,在“”中嵌入一个表达式,这就是元编程。毕竟,嵌入的的表达式并非真正的代码,它只是一个字符串,但是ruby却可以将它转换成...
Ruby中的钩子和回调允许开发者在运行时插入自定义代码来响应对象状态的变化。 10. 重载运算符和方法:Ruby允许程序员对操作符和方法进行重载,以提供更加面向对象的语法糖。例如,通过重载操作符 `,可以使自定义类...
8. 钩子(Hooks)和回调(Callbacks):Ruby允许在特定事件发生之前或之后执行代码,这些预定义的钩子或回调函数在很多场合都非常有用。 9. 模块扩展(Module#extend):使用extend可以将模块中的实例方法变成类...
在Ruby中,方法和类是构建程序的基本元素,它们是实现代码重用和组织的关键概念。 ### 方法(Methods) 方法在Ruby中是可重复使用的代码块,它们接受参数,执行特定任务,并可能返回值。方法定义使用`def`关键字...
在对Ruby进行了简要的综述之后,《Ruby编程语言》详细介绍了以下内容:Ruby的句法和语法结构,数据结构和对象,表达式和操作符,语句和控制结构,方法、proc、lambda和闭包,反射和元编程,Ruby平台。本书还包含对...
这在创建回调函数或动态构建行为时非常有用。 8. **DSL设计**:Ruby的元编程能力使得设计领域特定语言(DSL)变得容易,这可以极大地提高代码的可读性和表达力。 通过《Metaprogramming Ruby》的源代码,读者可以...
### Ruby动态编程语言的核心知识点 #### 一、Ruby的特点与优势 **1. 简洁而优雅** - **设计哲学:“最小意外原则”** - Ruby的设计理念旨在减少不必要的复杂性和冗余,使得代码更加直观易懂。 - **简洁的语法** ...
这种特性使得代码可以更加动态和适应性强。 3. **柯里化**:Functo也提供了柯里化(Currying)的功能,这是一种特殊的函数应用方式,将一个多参数的函数转化为一系列单参数的函数,每次只处理一个参数,直到所有...
Ruby元编程的核心概念包括类、模块、方法、变量和对象的动态性。以下是对这些概念的详细解释: 1. **类与模块**:在Ruby中,类和模块都是对象。你可以动态地创建和修改它们。例如,你可以通过`Class.new`创建一个新...
Ruby 体现了表达的一致性和简单性,它不仅是一门编程语言,更是表达想法的一种简练方式。 Ruby 是一个注重均衡的语言,它的发明者松本行弘(Yukihiro “Matz” Matsumoto),混合了他喜欢的多门语言(Perl、...
它们是元编程中常见的一部分,尤其是在迭代器和回调函数中。 7. **Ruby的鸭子类型**:Ruby强调“鸭子若能走路并嘎嘎叫,那它就是鸭子”,这意味着类型检查通常在运行时进行,这为元编程提供了便利。 通过学习...