这是以下问题.当我运行以下内容时:
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)
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |