我应该使用别名还是alias_method?

时间:2011-01-21 19:49:55

标签: ruby alias

我在aliasalias_method上发现了一篇博文。如该博客文章中给出的示例所示,我只想在同一个类中将方法别名为另一个。我应该使用哪个?我总是看到使用alias,但有人告诉我alias_method更好。

使用别名

class User

  def full_name
    puts "Johnnie Walker"
  end

  alias name full_name
end

User.new.name #=>Johnnie Walker

使用alias_method

class User

  def full_name
    puts "Johnnie Walker"
  end

  alias_method :name, :full_name
end

User.new.name #=>Johnnie Walker

Blog post link here

8 个答案:

答案 0 :(得分:375)

如果需要,可以重新定义

alias_method。 (它在Module类中定义。)

alias的行为会根据其范围而改变,有时可能会非常难以预测。

结论:使用alias_method - 它为您提供了更大的灵活性。

用法:

def foo
  "foo"
end

alias_method :baz, :foo

答案 1 :(得分:55)

除语法外,主要区别在于范围界定

# scoping with 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 #=> 'Geeky geek'

在上面的方法中,“name”选择“Developer”类中定义的方法“full_name”。现在让我们试试alias

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'

使用别名时,方法“name”无法选择Developer中定义的方法“full_name”。

这是因为alias是一个关键字,它是词法范围的。这意味着它在读取源代码时将self视为self的值。相反,alias_methodself视为在运行时确定的值。

来源:http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html

答案 2 :(得分:34)

我认为有一个不成文的规则(类似于约定),只是为了注册方法名别名而使用“别名”,意味着如果你想给你的代码用户一个带有多个名字的方法:

class Engine
  def start
    #code goes here
  end
  alias run start
end

如果您需要扩展代码,请使用ruby meta替代方案。

class Engine
  def start
    puts "start me"
  end
end

Engine.new.start() # => start me

Engine.class_eval do
  unless method_defined?(:run)
    alias_method :run, :start
    define_method(:start) do
      puts "'before' extension"
      run()
      puts "'after' extension"
    end
  end
end

Engine.new.start
# => 'before' extension
# => start me
# => 'after' extension

Engine.new.run # => start me

答案 3 :(得分:33)

支持alias而不是alias_method的一点是它的语义被rdoc识别,在生成的文档中导致整齐的交叉引用,而rdoc完全忽略alias_method。< / p>

答案 4 :(得分:22)

在询问问题一年后,有一篇关于这个主题的新文章:

http://erniemiller.org/2014/10/23/in-defense-of-alias/

似乎“这么多男人,这么多头脑。”在前一篇文章中,作者鼓励使用alias_method,而后者建议使用alias

然而,在博文和上面的答案中都有这些方法的共同概述:

  • 如果要将别名限制为定义范围
  • ,请使用alias
  • 使用alias_method允许继承的类访问它

答案 5 :(得分:9)

现在在Ruby Style Guide

中处理
  

在词法类作用域中使用别名方法时,首选别名   在这种背景下解决自我也是词汇,而且它   清楚地向用户传达别名的间接信息   除非作出,否则不会在运行时或任何子类中更改   明确的。

class Westerner
  def first_name
   @names.first
  end

 alias given_name first_name
end
  

在别名模块,类或类的方法时,始终使用alias_method   运行时的单例类,作为别名的词法范围导致   这些情况下的不可预测性

module Mononymous
  def self.included(other)
    other.class_eval { alias_method :full_name, :given_name }
  end
end

class Sting < Westerner
  include Mononymous
end

答案 6 :(得分:0)

alias_method new_method old_method

old_method 将在一个类或模块中声明,该类或模块现在继承到我们的类,其中将使用 new_method

这些可以是变量或方法。

假设Class_1具有old_method,Class_2和Class_3都继承了Class_1。

如果Class_1和Class_3的初始化在Class_1中完成,那么它们在Class_2和Class_3及其用法中可以有不同的名称。

答案 7 :(得分:-18)

虽然它可能很小,但我喜欢别名的两件事,比alias_method更多:

(1)别名更短

(2)你不必输入,

这很少,我知道,但是当你经历了几百次时,你只是倾向于选择别名