当我尝试将 alias_method 与继承一起使用时,我遇到了这种有线行为:
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
- 预期:“'第三个:结果'”
- 实际:“第二个:结果”
所以,我们可以这样解决:
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
但问题是:为什么在第一种情况下它没有按预期工作?
继承是一种“糟糕的模式”,但例如,当在 Rails 中使用带有 DRY 的策略继承时,它可能很有值(value)
最佳答案
事实证明,alias_method 创建了一个引用原始方法而不是覆盖方法的别名。
更多详细信息来源:https://theinternate.com/2014/02/14/inheritable-aliases-in-ruby.html
注意:
这对我来说很困惑,所以我决定分享它,我希望它对某人有帮助,以避免可能的困惑。
注_2:
与 alias
关键字相同:
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
可以用同样的方法解决:
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
关于ruby - 与继承一起使用时 `alias_method` 或 `alias` 关键字的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61734635/