`

深入理解alias, alias_method和alias_method_chain

阅读更多
http://blackanger.blog.51cto.com/140924/355102

1. alias
   Ruby里的关键字,用于定义方法或者全局变量的别名。 例子:
  class A
     def m1
       puts "m1"
     end
     alias m2 m1
    end
=> nil
a = A.new
=> #<A:0xb7ef5234>
 a.m1
m1
=> nil
a.m2
m1
=> nil


在使用的时候,注意原有的方法名在最后位置,用空格分开。

2. alias_method
作用和alias差不多,是Module的一个私有实例方法,只能用于给方法起别名,并且参数只能是字符串或者符号(alias后面跟的直接是方法名,不是字符串也不是符号)。例子:
class B
  def b
    p "b"
  end
  alias_method :c, :b
end
=> B
b = B.new
=> #<B:0xb7ee75bc>
b.c
"b"
=> nil
b.b
"b"
=> nil

注意,alias_method的参数必须是字符串或者是符号,并且用逗号分隔。
3.alias_method_chain
ncapsulates the common pattern of:
  alias_method :foo_without_feature, :foo
  alias_method :foo, :foo_with_feature

With this, you simply do:
  alias_method_chain :foo, :feature

替我们定义了两个方法:foo_with_feature 和 foo_without_feature <保存原来的foo方法>
def foo_with_feature
  在此添加想向foo方法里面写的代码
  foo_without_feature 调用一下原来的方法
end
分享到:
评论

相关推荐

    2015_07_08-module_prepend:Colin Kelley使用Ruby 2.1的Module#prepend进行面向方面的编程,2015年7月8日发表

    从一开始就使用#alias_method_chain在Ruby on Rails中几乎可以实现这种方法。 但是,该方法以分层分解而闻名。 Yehuda Katz写了一系列博客文章,提倡使用Module和#super更清洁的方法。 这种方法效果很好,但仅在...

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

    1. **alias_method** 和 **alias_method_chain**:这是过去常见的方法,通过别名来实现方法调用前后的额外操作。然而,这种方式需要手动管理别名,而且在Ruby 2.3之后,`alias_method_chain`不再推荐使用。 2. 使用...

    SSI框架搭建

    `result`节点的`name`和`type`属性分别指定结果类型和跳转策略,`type`常见的有`dispatcher`(用于转向JSP)和`chain`(用于转向另一个Action)。 3. **验证框架**: Struts2提供了内置的验证机制。在需要验证的...

    Struts2.0框架技术详解

    - **更好的组织代码**:不同的组件负责不同的功能,使代码更易于理解和管理。 - **便于团队协作**:由于每个部分都有明确的职责,团队成员可以专注于自己负责的部分,提高开发效率。 - **易于复用**:由于组件之间的...

    SSI框架 部署手册

    &lt;alias name="dataSource" alias="ds"/&gt; ``` 这样就可以使用`ds`代替`dataSource`来引用数据源对象。 **3.3 SQL配置文件** IBATIS使用SQL映射文件来定义SQL语句及其结果集的映射关系。 - **配置示例**: ```...

    拦截器,实用型

    &lt;interceptor-ref name="alias" /&gt; &lt;interceptor-ref name="chain" /&gt; &lt;action name="home" class="com.example.HomeAction" method="execute"&gt; ...

    Java英文单词汇总

    了解这些单词的含义可以帮助开发者更好地理解 Java 语言,并提高编程效率。 Abstract:抽象的,指的是不依赖于具体实现的代码。 Abstract Base Class (ABC):抽象基类,是一种特殊的基类,它定义了一些抽象方法,...

    计算机网络第六版答案

    Computer Networking: A Top-Down Approach, 6th Edition Solutions to Review Questions and Problems Version Date: May 2012 ...This document contains the solutions to review questions and problems for...

    前端-后端java的Util类的工具类

    卷 文档 的文件夹 PATH 列表 卷序列号为 000C-BB91 E:. │ config.properties │ Dao.java │ GeneratorDemo.java │ hibernate.cfg.xml │ HibernateDaoImpl.java │ HibernateSessionFactory.java ...

Global site tag (gtag.js) - Google Analytics