`

ruby的动态性 回调和钩子方法

 
阅读更多
==回调方法和钩子方法
回调和钩子是相当常见的元编程技术。在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回调的通用钩子。 介绍 挂钩允许您在Ruby类中声明性地定义挂钩。 您可以将回调添加到您的钩子中,该回调将在您运行钩子后立即运行! 几乎就像ActiveSupport :: Callbacks,但复杂度降低了76.6%。 相反,它...

    实例讲解Ruby中的钩子方法及对方法调用添加钩子

    钩子方法有些类似事件驱动装置,可以在特定的事件发生后执行特定的回调函数,这个回调函数就是钩子方法(更形象的描述: 钩子方法可以像钩子一样,勾住一个特定的事件。),在Rails中before\after函数就是最常见的钩子...

    Ruby中钩子方法的运用实例解析

    主要介绍了Ruby中钩子方法的运用实例解析,钩子方法的使用时Ruby入门学习中的基础知识,需要的朋友可以参考下

    Ruby中的钩子方法详解

    本文将探讨Ruby中的一些重要的钩子方法。我们将从不同方面讨论钩子方法,如它们是什么,它们用于什么,以及我们如何使用它们来解决不同的问题。 我们同时也了解一下一些流行的Ruby框架/Gem包/库是如何使用它们来...

    Ruby动态特性详细介绍

    在ruby代码中,其实我们一直都在进行元编程,虽然可能只是一句非常简单的代码,比如说,在“”中嵌入一个表达式,这就是元编程。毕竟,嵌入的的表达式并非真正的代码,它只是一个字符串,但是ruby却可以将它转换成...

    Ruby编程语言

    在对Ruby进行了简要的综述之后,《Ruby编程语言》详细介绍了以下内容:Ruby的句法和语法结构,数据结构和对象,表达式和操作符,语句和控制结构,方法、proc、lambda和闭包,反射和元编程,Ruby平台。本书还包含对...

    Ruby动态编程语言v2.6.3

    Ruby 体现了表达的一致性和简单性,它不仅是一门编程语言,更是表达想法的一种简练方式。 Ruby 是一个注重均衡的语言,它的发明者松本行弘(Yukihiro “Matz” Matsumoto),混合了他喜欢的多门语言(Perl、...

    Ruby 方法、类

    Ruby 方法、类 : Ruby 方法、类 ruby-9-method.mp4 ruby-9-method.mp4

    garfio:Garfio 帮助您在 ruby​​ 对象中构建钩子

    只需几行代码,一个方法编译,没有猴子补丁,也没有method missing Garfio 允许您在运行方法之前和之后立即启动回调。 安装 安装 Garfio 就像运行一样简单: $ gem install garfio 使用 gem 'garfio' 将 Garfio ...

    ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码

    ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码

    Ruby-Functo是ruby中的可组合方法对象

    Functo是ruby中的可组合方法对象

    ruby2ruby.zip

    ruby2ruby 提供一些用来根据 RubyParser 兼容的 Sexps 轻松生成纯 Ruby 代码的方法。可在 Ruby 中轻松实现动态语言处理。 标签:ruby2ruby

    笨方法学ruby.

    ruby\笨方法学\笨方法学

    Ruby-rubybuild编译和安装Ruby

    ruby-build - 编译和安装Ruby

    笨方法学习 Ruby 电子书

    很好的ruby学习材料,ruby的入门有点难,比较繁琐,这本书很好的帮助大家开启ruby的大门

    git-hooks:一些有用的 ruby​​ git 钩子

    这个 gem 提供了一个接口来在 Ruby 中编写有用的 git 钩子。 在任何编程语言的项目中工作时都可以使用这些钩子。 安装 将此行添加到您的应用程序的Gemfile : gem 'git-hooks' 然后执行: $ bundle 或者自己...

    ruby DBI ruby DBI ruby DBI

    ruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ...

    笨方法学Ruby

    笨方法学Ruby中文pdf。感兴趣的人可以拿来学习ruby语言。

Global site tag (gtag.js) - Google Analytics