`

alias_method_chain方法在3.1以后的替代使用方式

阅读更多
alias_method_chain()
是rails里的一个广泛使用的方法,简单说,就是你要重写一个方法,在里面加上一个新方法后,还要使用同名的原方法调用。

使用和实现如下,

class Klass
  def salute_with_log
    puts "Calling method..."
    salute_without_log
    puts "...Method called"
  end

  alias_method :salute_without_log, :salute
  alias_method :salute, :salute_with_log
end

Klass.new.salute
# Prints the following:
# Calling method...
# Aloha!
# ...Method called


再看一个
  module InstanceMethods
    def deliver_with_switchable_smtp!(mail = @mail)
      unless logger.nil?
        logger.info  "Switching SMTP server to: #{custom_smtp.inspect}" 
      end
      ActionMailer::Base.smtp_settings = custom_smtp unless custom_smtp.nil?
      deliver_without_switchable_smtp!(mail = @mail)
    end
  end
  def self.included(receiver)
    receiver.send :include, InstanceMethods
    receiver.class_eval do
      alias_method_chain :deliver!, :switchable_smtp
    end
  end
end


就说这个事现在流行的方式怎么调:
class Something
  module Base  
    def my_method
      # (A) original functionality
    end
  end

  module PreExtension
    def my_method
      # (B) before the original
      super # calls whatever was my_method before this definition was made
    end
  end

  module PostExtension
    def my_method
      super # calls whatever was my_method before this definition was made
      # (C) after the original
    end
  end

  include Base # this is needed to place the base methods in the inheritance stack
  include PreExtension # this will override the original my_method
  include PostExtension # this will override my_method defined in PreExtension
end

s = Something.new
s.my_method 
#=> this is a twice extended method call that will execute code in this order:
#=> (B) before the original
#=> (A) the original
#=> (C) after the original


super是上一个module里同名方法
include有个顺序覆盖

  module PreExtension; end
  module PostExtension; end

  include PreExtension
  include PostExtension
end

Something.ancestors # => [Something, Something::PostExtension, Something::PreExtension, Object, Kernel]



class SomethingNew
  module Base
    def my_method
      puts "(A)"
    end
  end

  module Extension
    def my_method
      puts "(B)"
      super
    end
  end

  include Base
  include Extension
end

SomethingNew.new.my_method
# Output:
# >> (B)
# >> (A)

SomethingNew.ancestors # => [SomethingNew, SomethingNew::Extension, SomethingNew::Base, Object, Kernel]

分享到:
评论
5 楼 ruby_windy 2012-02-06  
see 这个stackoverflow页:

http://stackoverflow.com/questions/3689736/rails-3-alias-method-chain-still-used
4 楼 Hooopo 2012-02-05  
是Rails里面不用这个方法了,但是还在activesupport里,没有移除。
写插件用super是不行的,还得用alias method chain.
3 楼 夜鸣猪 2012-02-05  
Hooopo 写道
什么时候移掉的?求链接。。

俺是看railscast里提到,rails开始用新的方式
http://railscasts.com/episodes/232-routing-walkthrough-part-2
这个也有提到
http://piotrsarnacki.com/2010/06/18/rails-internals-railties/
ms都不是官方声明
2 楼 Hooopo 2012-02-05  
什么时候移掉的?求链接。。
1 楼 ruby_windy 2012-02-05  
alias_method_chain并不那么清楚,移掉蛮好的.

新方法使用super,实现很ruby化~明白include的加载机制十分重要~

相关推荐

    ios socket demo

    int connect(int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS_C(connect); // 发送数据 ssize_t send(int, const void *, size_t, int) __DARWIN_ALIAS_C(send); // void * 万能指针 // 读取数据 ssize_t...

    源代码+解析ALIAS_OBJ.pro

    具体来说,在图形应用中,如果一个大型的对象(如复杂的3D模型或大型数据集)需要被多个视图显示时,使用`ALIAS`关键字可以避免为每个视图创建独立的副本,而是通过引用的方式来展示同一对象,这样可以显著降低内存...

    es_alias_manager.sh

    es_alias_manager.sh

    nangua_envTestWithDevKit_V4.1.7_2108061935_alias_b.apk

    nangua_envTestWithDevKit_V4.1.7_2108061935_alias_b.apk

    ALIAS_NA.RSA

    ALIAS_NA.RSA

    VITON-HD — Official PyTorch Model alias_final.pth

    VITON-HD — Official PyTorch Model alias_final.pth

    一个管理Linux命令别名的小工具,基于golang实现_alias_tips.zip

    为了提高工作效率,用户经常会使用别名(alias)功能,将长的或者复杂的命令简化成简短易记的形式。别名可以在用户的家目录下的.bashrc或.zshrc配置文件中定义,也可以在系统级别定义,但这样做的缺点是管理和更新...

    基于_alias_实现的中文_Linux_命令行_chinese-command-line.zip

    本项目的实现方法是在Linux系统中预设一系列中文命令别名,用户在使用这些中文命令时,实际上是在调用系统的Alias机制执行对应的英文命令。这样的处理方式不仅保留了原有Linux命令行的功能性,而且极大地降低了中文...

    alias_manager:alias_manager是一个程序,可以帮助您管理别名

    .bashrc文件在每次操作后为即时应用程序提供资源,因此您无需重新引导或注销/登录即可使用新别名。 每次操作之前,都会在主目录下创建.bashrc文件的备份。 根据每次操作的成功,将其删除或还原 安装 在终端中复制...

    Documentum 基础培训 08 Alias Sets

    要在Documentum中使用别名,你需要遵循一定的格式`%[alias_set_name.]alias_name`。其中,`alias_set_name`标识了别名集对象,`alias_name`指定了别名集对象中alias_name属性的一个别名。比如,`%engr_aliases.engr...

    copy_method:实验性地将方法从一个类复制到另一个类。 这里有龙

    这个想法是最终允许元编程与Python装饰器一起使用,而不必过多使用alias_method等。 换句话说,保留super /继承/方法重写。 尽管它是非常非常具有实验性的,并且有一些警告,但是它大部分都可以工作。 与创建的方法...

    医疗病例数据信息(共1193条病例信息)

    数据列: case_id(病例ID) case_name(病例名称) case_introduction(病例简介) case_alias(病例别名) case_medical_insurance(是否医保) case_infectivity(传染...case_therapeutic_method_long(治疗方法2)

    如何实现apache动态虚拟主机和激活mod_vhost_alias.so模块

    ### 如何实现Apache动态虚拟主机和激活mod_vhost_alias.so模块 #### 一、概述 在实际应用中,为了能够在一个服务器上同时运行多个网站,就需要用到虚拟主机技术。Apache HTTP Server支持多种类型的虚拟主机配置,...

    虚拟主机配置教程,包括apache mod_vhost_alias模块

    虚拟主机配置是网络服务器管理中的一个重要环节,尤其在运行多个网站或应用时。Apache HTTP Server是广泛应用的开源Web服务器,其强大的灵活性和可扩展性使得配置虚拟主机变得相对简单。本教程将详细介绍如何使用...

    基于OpenSIPs的模块编程

    通过对`Alias_db`模块的分析,我们不仅学习了如何在OpenSIPs中开发模块,还掌握了如何管理配置参数、实现功能函数以及定义模块接口等关键技术。这些技能对于任何希望利用OpenSIPs进行自定义开发的工程师都是非常宝贵...

    walker_method:Walker别名方法的Crystal实现,用于从具有给定概率分布的数组中快速采样

    walker_method:Walker别名方法的Crystal实现,用于从具有给定概率分布的数组中快速采样

    bash-alias-completion:Bash完成别名

    bash-alias-completion ... 不应正常调用此脚本,而应在定义别名后使用source alias_completion.sh (使用source alias_completion.sh或. alias_completion.sh )。 恕我直言,最好的方法是将其放在文件~/.bashrc末尾。

    sdr_trunk_alias_import:将SDR-Trunk的CSV导入XML的粗导入脚本

    步骤3)在您的收藏alias.xml编辑器中打开alias.xml 步骤4)将所有内容复制到alias.xml中 步骤5)在收藏夹编辑器的SDR-Trunk播放列表文件夹中打开default.xml 。 步骤6)在<\playlist>之前转到default.xml文件的...

    Ruby-Ruby技巧惯用Ruby重构和最佳实践

    4. 方法引荐(Method Aliasing):`alias_method`可以创建方法别名,如`alias_method :new_method, :old_method`。 5. 符号到方法转换(Symbol to Proc):`&`操作符可以将符号转换为Proc,如`[:upcase].to_proc....

    Alias2.4 for linux 程序库

    在使用Alias2.4程序库时,开发者需要遵循一些步骤: 1. **安装**:首先,将ALIAS_TAR文件解压到本地文件系统中,通常会选择一个合适的目录,如/usr/local或个人的工作空间。 2. **配置**:根据说明文件,配置库的...

Global site tag (gtag.js) - Google Analytics