让我们对这个问题的缘故创造价值:斯卡拉强调最小功能
val a = 1 :: Nil
现在,我可以证明,匿名函数可以简写形式写成这样:
a.map(_*2)
是否可以编写此功能的简写?:
a.map((x) => x)
我的解决方案不起作用:
a.map(_)
让我们对这个问题的缘故创造价值:斯卡拉强调最小功能
val a = 1 :: Nil
现在,我可以证明,匿名函数可以简写形式写成这样:
a.map(_*2)
是否可以编写此功能的简写?:
a.map((x) => x)
我的解决方案不起作用:
a.map(_)
你的第一个简写形式,也可以写自由点
a map (2*)
由于乘法是可交换的。
至于(x) => x
,你想要identity
函数。这在Predef中定义并且是通用的,所以您可以确定它是类型安全的。
我认为你的意思是交换。 – Debilski 2010-12-12 14:19:00
可惜'x => x'是四个字符,而'identity'是八个字符。这就是为什么我从不使用“身份”。 – 2010-12-12 14:50:05
@debilski这东西不容易,你知道!不是当18个月的战斗时间来访问键盘! – 2010-12-12 18:45:58
您应该对此用例使用identity
函数。
a.map(identity)
identity
在scala.Predef定义为:
implicit def identity[A](x: A): A = x
根据记录,a.map(_)
不起作用,因为它代表x => a.map(x)
,而不是a.map(x => x)
。发生这种情况是因为单个_
代替参数代表部分应用的函数。在2*_
的情况下,这代表匿名函数。这两种用法非常接近,很容易让他们感到困惑。
没有多大意义,是吗?这只是一个NOP。 – delnan 2010-12-12 14:11:50
这只是一个例子。它可以在上下文中产生一些意义 – coubeatczech 2010-12-12 14:21:19
这是一个很好的例子,说明Scala中'_'糖的过度使用(imho)真的使得人们难以接受语言。 – akauppi 2013-03-03 21:29:25