使用继承时 `alias_method` 或 `alias` 关键字的意外行为
Unexpected behavior of the `alias_method` or `alias` keyword when usage with an inheritance
我在尝试将 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
- 预计:“'Third:result'”
- 实际:"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
但问题是:为什么在第一种情况下它没有像 预期的那样工作?
继承是一种 "bad pattern",但在 Rails 中使用带有 DRY 的策略继承时它可能很有价值,例如
Turns out that alias_method creates an alias that references the original method rather than the overwritten one.
具有更多详细信息的来源:https://theinternate.com/2014/02/14/inheritable-aliases-in-ruby.html
注:
我很困惑,所以我决定分享它,我希望它对某些人有帮助,避免可能的混淆。
note_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
我在尝试将 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
- 预计:“'Third:result'”
- 实际:"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
但问题是:为什么在第一种情况下它没有像 预期的那样工作?
继承是一种 "bad pattern",但在 Rails 中使用带有 DRY 的策略继承时它可能很有价值,例如
Turns out that alias_method creates an alias that references the original method rather than the overwritten one.
具有更多详细信息的来源:https://theinternate.com/2014/02/14/inheritable-aliases-in-ruby.html
注:
我很困惑,所以我决定分享它,我希望它对某些人有帮助,避免可能的混淆。
note_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