只要使用字母数字命名运算符piper
和tapper
,一切都很好。(旁注:从Scala 2.13的管道和水龙头复制)
package playground
object NonAlphaOperatorName {
implicit final class MyChainingOps[A](private val me: A) extends AnyVal {
def piper[B](f: A => B): B = f(me)
def tapper[B](f: A => B): A = {
f(me)
me
}
}
def main(args: Array[String]): Unit = {
100 piper
(r => r + 1) piper
(r => r + 5) tapper
(r => println(s"...$r...")) piper
println
}
}
问题:当我将piper
重命名为|>
时,我得到一个编译器错误";缺少参数类型";。
(旁注:另一方面,将piper
重命名为__
(双下划线)也可以)
package playground
object NonAlphaOperatorName {
implicit final class MyChainingOps[A](private val me: A) extends AnyVal {
def |>[B](f: A => B): B = f(me)
def tapper[B](f: A => B): A = {
f(me)
me
}
}
def main(args: Array[String]): Unit = {
100 |>
(r => r + 1) |>
(r => r + 5) tapper
(r => println(s"...$r...")) |> //error: missing parameter type [17:8]
println
}
}
你能帮我解释一下这个问题吗?Scala2.13中有解决这个问题的方法吗?
在两个示例中,运算符的优先级不同。
在第一个例子中,piper
和tapper
都具有相同的优先级,因此该代码等效于下面的全括号和"0";虚线";版本:
100.piper(r => r + 1).piper(r => r + 5).tapper(r => println(s"...$r...")).piper(println)
在第二个例子中,|>
的优先级高于tapper
,因此该代码等效于下面的全括号和"0";虚线";版本:
100.|>(r => r + 1).|>(r => r + 5).tapper((r => println(s"...$r...")).|>(println))