别名foo bar与foo = bar之间的区别

问题描述 投票:3回答:3

[通过rubylearning教程学习ruby时,我不得不'使用别名'部分。我无法理解使用别名之间的区别,例如:

def oldmtd  
  "old method"  
end  
alias newmtd oldmtd  
def oldmtd  
  "old improved method"  
end  
puts oldmtd  
puts newmtd

带输出

old improved method
old method

并且只需为此函数分配一个新变量,例如:

def oldmtd  
  "old method"  
end  
newmtd = oldmtd  
def oldmtd  
  "old improved method"  
end  
puts oldmtd  
puts newmtd

具有相同的输出:

old improved method
old method

请告诉我什么是实际区别,何时使用'别名'是正确的?

ruby
3个回答
2
投票

使用newmtd = oldmtd,您没有为函数分配新变量;您正在为函数的result分配一个变量,即字符串。用Python术语:newmtd = oldmtd()


0
投票

别名允许您使用其他名称调用对象。当您进行变量分配时,将为它分配=运算符右侧返回的值。

当您重新定义原始方法时,您还重新定义了别名方法,因为它仍然调用已为其别名的原始方法。

但是,如果要为方法添加别名,则可能要使用alias_method。有关更多信息,请参见this question

关于何时或为什么使用别名,请参阅answers to this question


0
投票

此声明:

newmtd = oldmtd  

将通过调用oldmtd()返回的字符串分配给变量newmtd。这是一个简单的字符串分配。您可以像这样验证它:

> newmtd = oldmtd
> method :oldmtd
=> #<Method: main.oldmtd>                     # <- this is a real method
> medhod :newmtd
=> NameError (undefined method 'newmtd' ...)  # <- no such method exists

但是使用alias,两者都将返回一个实数方法。

> alias newmtd oldmtd
> method :oldmtd
=> #<Method: main.oldmtd>           # <- this is a real method
> medhod :newmtd
=> #<Method: main.newmtd(oldmtd)>   # <- this is a real method, aliased
© www.soinside.com 2019 - 2024. All rights reserved.