提问人:dbingham 提问时间:8/31/2023 更新时间:8/31/2023 访问量:84
为什么正确的关联扩展方法具有与正常方法相反的目标?
Why do right associative extension methods have the opposite target from normal methods?
问:
虽然我理解需要将操作数重新交换为扩展方法上的curried参数,但我仍然不明白实际的行为差异。从调用方的角度来看,相同的语法会导致令人困惑的不同行为。
举个微不足道的例子:
class S (s: String):
def ?:(i: I): String = "On S"
class I(i: Int):
def ?:(s: S): String = "On I"
extension (s1: S)
def +:(i1: I): String = "On S"
extension (i1: I)
def +:(s1: S): String = "On I"
在扩展方法中,我正在扩展(或添加方法)目标类型。例如,第一个将 添加到 .所以我希望那里的行为与上面的 S 相同。但实际上恰恰相反:S
+:
?:
S("foo") ?: I(1) // I is the target and it returns "On I"
S("foo") +: I(1) // S is the target and it returns "On S"
这是一个错误吗?还是 Scala 3 正在走向一个类方法的行为在这里是错误的未来?基本上。。。对于语言新手来说,这两者怎么可能是正确和明确的。
顺便说一句,这不是 Scala 2 语法的问题:
implicit class S1(s: S):
def %:(i: I): String = "On S"
implicit class I1(i: I):
def %:(s: S): String = "On I"
S("foo") ?: I(1) // I is the target and it returns "On I"
S("foo") %: I(1) // I is the target and it returns "On I"
需要明确的是,我不是在寻找我上面引用的链接中提供的扩展方法实现的解释。我理解这方面。
我也不对使用左右关联方法的链式操作的括号顺序感到困惑。
我不明白的是,从语言设计的角度来看,两者和(如上所述)如何被认为是“正确的”?它们在语法上是相同的,但在确定目标和操作数方面是相互对立的。S("foo") ?: I(1)
S("foo") +: I(1)
答: 暂无答案
评论