这里有一个简化、解释和美化。
简化,
scala> def f: String => String = {
| val i = 7
| { (x: String) =>
| "y"
| }
| }
<console>:9: error: Int(7) does not take parameters
{ (x: String) =>
^
<console>:12: error: type mismatch;
found : Unit
required: String => String
}
^
这失败了,因为后面的换行符7
没有被当作分号,因为它可能是一个函数应用程序;您可能需要一个大括号位于下一行的 DSL。 这是nl
带有大括号的 arg 语法中的一点点。
换行处理在规范的 1.2 中描述;nl
在本节末尾提到了一些像这样的地方,其中接受单曲。
(两个换行符不起作用,这就是为什么这也可以解决您的问题。)
请注意,nl
在括号前面不接受 a ,因此以下工作(尽管只有括号,您的函数文字只能得到一个表达式):
scala> def g: String => String = {
| val i = 7
| ( (x: String) =>
| "y"
| )
| }
g: String => String
其实问题代码最好的编辑不是大括号多而是少:
scala> def f: String => String = {
| val i = 7
| x: String =>
| "y"
| }
f: String => String
这种好语法的原因是你的方法体已经是一个块表达式,当一个块的结果表达式是一个函数字面量时,你可以简化。
的类型x
也是多余的。
scala> def f: String => String = {
| val i = 7
| x =>
| val a = "a"
| val b = "b"
| a + i + x + b
| }
f: String => String
毫不奇怪:
scala> def f: (String, Int) => String = {
| val i = 7
| (x, j) =>
| x + (i + j)
| }
f: (String, Int) => String
scala> f("bob",70)
res0: String = bob77