美文网首页
ruby 中 alias vs alias_method

ruby 中 alias vs alias_method

作者: 小新是个程序媛 | 来源:发表于2018-05-03 18:02 被阅读312次

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多次上述实现代码(不要执行多次上述代码,可以重开窗口执行),结果会和预期不一致,还没细想,如有结论还会更新

相关文章

网友评论

      本文标题:ruby 中 alias vs alias_method

      本文链接:https://www.haomeiwen.com/subject/ekklrftx.html