我正在使用 _
作为创建匿名函数的占位符,问题是我无法预测 Scala 将如何转换我的代码。更准确地说,它错误地确定了我想要的匿名函数有多“大”。
List(1,2,3) foreach println(_:Int) //error !
List(1,2,3) foreach (println(_:Int)) //work
List(1,2,3) foreach(println(_:Int)) //work
使用
-Xprint:typer
我可以看到 Scala 将第一个转换为“一个大的匿名函数”:x$1 => List(1,2,3) foreach(println(x$1:Int))
工作的第 2 次第 3 次正确转变为我想要的。
... foreach (x$1 => println(x$1:Int))
为什么这个?有什么规律?
最佳答案
确定下划线范围的简单规则:
因此,根据规则 #1,而不是
println((x: Int) => x)
,范围将放在(包括)println
之外.根据规则 #2,后两个示例将具有由括号分隔的函数,因此
(x => println(x: Int))
.根据规则 #3,第一个示例将是整个表达式,因为没有分隔括号。
关于scala - 管理下划线以定义匿名函数的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28125850/