Ruby 与继承一起使用时,`alias_method`或`alias`关键字的意外行为
在尝试将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
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是的,你的权利,它是关键字,它是打字错误,我编辑了答案,谢谢!