为什么正确的关联扩展方法具有与正常方法相反的目标?

Why do right associative extension methods have the opposite target from normal methods?

提问人:dbingham 提问时间:8/31/2023 更新时间:8/31/2023 访问量:84

问:

我已经阅读了所有的参考文档扩展解释,并看到了相关的问题

虽然我理解需要将操作数重新交换为扩展方法上的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)

扩展方法 Scala-3 关联性

评论

0赞 Silvio Mayolo 8/31/2023
我来这里是为了写一个答案并澄清这一点。但是当我阅读你链接的文件时,我发现自己和你一样困惑。好问题,我希望有人来回答这个问题,为了我们俩。
1赞 Luis Miguel Mejía Suárez 8/31/2023
恕我直言,听起来像个错误。
2赞 Gaël J 8/31/2023
github.com/lampepfl/dotty/issues 是举报的好地方。
2赞 dbingham 9/1/2023
报道
1赞 dbingham 9/6/2023
对于那些关注这些事情的人,我的错误报告已按设计关闭。我跟进了,要求澄清如何将记录的行为与实际行为保持一致,并就如何就语言设计问题提供反馈(如果这不是一个错误)提供指导。

答: 暂无答案