Ruby 与继承一起使用时,`alias_method`或`alias`关键字的意外行为

Ruby 与继承一起使用时,`alias_method`或`alias`关键字的意外行为,ruby,inheritance,alias,Ruby,Inheritance,Alias,在尝试将alias_方法与继承一起使用时,我会出现这种有线行为: class First def calculate puts value end end class Second < First def result 'Second:result' end alias_method :value, :result end class Third < Second def result 'Third:result' end en

在尝试将alias_方法与继承一起使用时,我会出现这种有线行为:

class First
  def calculate
    puts value
  end
end

class Second < First
  def result
    'Second:result'
  end
  alias_method :value, :result
end

class Third < Second
  def result
    'Third:result'
  end
end

Third.new.calculate
# => Second:result
第一类
def计算
重视
结束
结束
二等<一等
def结果
“第二:结果”
结束
别名\方法:值,:结果
结束
三等<二等
def结果
“第三:结果”
结束
结束
第三,新的
#=>第二:结果
  • 预期:“‘第三:结果’”
  • 实际:“第二:结果”
因此,我们可以这样解决:

class First
  def calculate
    puts value
  end
end

class Second < First
  def result
    'Second:result'
  end

  def value
    result
  end
end

class Third < Second
  def result
    'Third:result'
  end
end

Third.new.calculate
# => Third:result
class First
  def calculate
    puts value
  end
end

class Second < First
  def result
    'Second:result'
  end
  alias_method :value, :result
end

class Third < Second
  def result
    'Third:result'
  end
  alias_method :value, :result
end

Third.new.calculate
# => Third:result
第一类
def计算
重视
结束
结束
二等<一等
def结果
“第二:结果”
结束
def值
结果
结束
结束
三等<二等
def结果
“第三:结果”
结束
结束
第三,新的
#=>第三:结果
或者这样:

class First
  def calculate
    puts value
  end
end

class Second < First
  def result
    'Second:result'
  end

  def value
    result
  end
end

class Third < Second
  def result
    'Third:result'
  end
end

Third.new.calculate
# => Third:result
class First
  def calculate
    puts value
  end
end

class Second < First
  def result
    'Second:result'
  end
  alias_method :value, :result
end

class Third < Second
  def result
    'Third:result'
  end
  alias_method :value, :result
end

Third.new.calculate
# => Third:result
第一类
def计算
重视
结束
结束
二等<一等
def结果
“第二:结果”
结束
别名\方法:值,:结果
结束
三等<二等
def结果
“第三:结果”
结束
别名\方法:值,:结果
结束
第三,新的
#=>第三:结果
但问题是:为什么在第一种情况下它没有像预期的那样起作用


继承是一种“坏模式”,但在Rails中使用干式策略继承时,它可能很有价值,例如,

发现alias\u方法创建的别名引用了原始方法,而不是被覆盖的方法。

提供更多详细信息的来源:


注:

这对我来说很困惑,所以这就是我决定分享它的原因,我希望它能对某些人有所帮助,避免可能的困惑


注2:

别名
关键字相同:

class First
  def calculate
    puts value
  end
end

class Second < First
  def result
    'Second:result'
  end
  alias value result
end

class Third < Second
  def result
    'Third:result'
  end
end

Third.new.calculate
# => Second:result
第一类
def计算
重视
结束
结束
二等<一等
def结果
“第二:结果”
结束
别名值结果
结束
三等<二等
def结果
“第三:结果”
结束
结束
第三,新的
#=>第二:结果
可以用相同的方法解决:

class First
  def calculate
    puts value
  end
end

class Second < First
  def result
    'Second:result'
  end
  alias value result
end

class Third < Second
  def result
    'Third:result'
  end
  alias value result
end

Third.new.calculate
# => Third:result
第一类
def计算
重视
结束
结束
二等<一等
def结果
“第二:结果”
结束
别名值结果
结束
三等<二等
def结果
“第三:结果”
结束
别名值结果
结束
第三,新的
#=>第三:结果

也许你应该使用
别名
,而不是
别名方法
?@user1934428我已经更新了答案。正如您所看到的,alias和methodAh一样,您是对的。在您的情况下,不会显示。顺便说一句,您不应该调用
alias
方法
alias\u method
是一种方法,但是
alias
是一个关键字。@user1934428是的,你的权利,它是关键字,它是打字错误,我编辑了答案,谢谢!