ruby 中 alias vs alias_method

alias 和 alias_method都是可以重命名一个方法

区别

1. alias可以重命名全局变量,alias_method不可以

$old_name = 'old'
#注:重命名全局变量只能使用变量名 不能使用符号
alias $new_name $old_name
puts $new_name
=>old

2. 关键字与方法的不同

alias是一个关键字,alias_method是module类的一个方法
使用方法:

alias :new_name old_name
#有逗号
alias_method :new_name, :old_name 

3. 参数不同

alias的参数可以是方法名或符号,不能是字符串
alias_method的参数可以是字符串或符号

class Array
  alias f1 first
  alias :f2 :first
  alias_method 'f3', 'first'
  alias_method :f4, :first
end

#动态调用方法
%w(f1 f2 f3 f4).each do |f|
  puts [1,2,3,4].send(f)
end

=>1
=>1
=>1
=>1

3. 作用域不同

从如下两个例子中可以看出作用域不同,alias是进入原类进行操作,而alias_method是查找当前类同名方法进行操作

class User

  def full_name
    puts "Johnnie Walker"
  end

  def self.add_rename
    alias_method :name, :full_name
  end
end

class Developer < User
  def full_name
    puts "Geeky geek"
  end
  add_rename
end

Developer.new.name #=> 'Gekky geek'
class User

  def full_name
    puts "Johnnie Walker"
  end

  def self.add_rename
    alias :name :full_name
  end
end

class Developer < User
  def full_name
    puts "Geeky geek"
  end
  add_rename
end

Developer.new.name #=> 'Johnnie Walker'

注:在子类重写父类已经存在的方法时,可以通过alias或alias_method调用旧方法

class OldDemo
  def hello
    puts 'old hello'
  end
end

class NewDemo < OldDemo
  #注意alias的位置要在重写方法之前
  alias old_hello hello
  def hello
    puts 'new hello'
  end
end

obj = NewDemo.new
obj.hello
=>new hello

obj.old_hello
=>old hellp

注意:不要尝试load多次上述实现代码(不要执行多次上述代码,可以重开窗口执行),结果会和预期不一致,还没细想,如有结论还会更新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容