美文网首页
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