结合名称冒号操作符和空间不连贯性

Mik*_*yer 8 scala

这是以下问题.当我运行以下内容时:

object  Test {
  def /:(s: => Unit) = {
    println("/:")
    s
  }
}

println("A") /: Test
Run Code Online (Sandbox Code Playgroud)

它打印:

A
/:
Run Code Online (Sandbox Code Playgroud)

但是,我期待它打印:

/:
A
Run Code Online (Sandbox Code Playgroud)

因为最后一个表达式被认为是重写的Test./:(println("A"))- 顺便说一下,它给出了第二个值.

有没有人知道使第一种语法有效的方法,例如println("A") /: Test但是使用call-by-name?

编辑

使用desugar方法,我发现调用的方式不同.

> desugar { println("A") /: Test}
 val x$1: Unit = println("A");
 Test./:(x$1)
Run Code Online (Sandbox Code Playgroud)

因此我仍然想知道为什么这个选择.

小智 10

这是一个众所周知的问题.如果使用-Xlint选项进行编译,则应该看到警告.

$ scalac -Xlint temp.scala
temp.scala:2: warning: by-name parameters will be evaluated eagerly when called 
              as a right-associative infix operator. For more details, see SI-1980.
    def /:(s: => Unit) = {
        ^
one warning found
Run Code Online (Sandbox Code Playgroud)