阅读Scala 中大括号和圆括号之间的形式区别是什么,什么时候应该使用它们?,我仍然不知道如何理解 . 包裹的函数值{}
。
考虑以下两个 REPL 会话:
@ val f = { (x: Int) =>
x
val y = x
y
}
f: Int => Int = ammonite.$sess.cmd30$$$Lambda$1765/0x0000000801346840@24c7b944
@ { (x: Int) =>
x
val y = x
y
}
cmd31.sc:3: not found: value x
val y = x
^
Compilation Failed
我有几个问题。
- 为什么第一个片段编译而第二个不编译?在第一个片段中,编译器知道
{...}
作为一个整体是一个函数值。在第二个片段中,只有(x: Int) => \n x
部分是函数值(对不起\n
,表示换行符)。为什么? - 关于
{ (x: Int) => \n ... }
,它什么时候被解释为函数值,什么时候不是? - 花括号 (
{}
) 是函数值的一部分,还是仅(...) => ...
在函数值内部?如果它是它的一部分,表格是否有名称?例如,我认为(_ + _)
可以称为函数值的占位符语法。
更新:这纯粹是一个菊石问题。详情见答案。