我玩了一些占位符,发现一个奇怪的情况:
val integers = Seq(1, 2)
val f = (x:Int) => x + 1
integers.map((_, f(_)))
哪个返回
Seq[(Int, Int => Int)] = List((1,<function1>), (2,<function1>))
我期待
Seq[(Int, Int)] = List((1, 2), (2, 3))
如果我进行以下更改,一切都会按预期进行:
integers.map(i => (i, f(i)))
知道为什么在映射过程中未应用功能
f
的想法吗? 最佳答案
Scala编译器无法理解您的想法,因此_
占位符语法仅在非常简单的表达式中有用。
在您的示例中:
integers.map((_, f(_)))
它将
f(_)
评估为独立的子表达式,因此最终得到的结果与此等效:x => (x, y => f(y))
即使编译器未将
f(_)
视为自己的子表达式,其结果也将与您想要的结果不同:integers.map(i => (i, f(i)))
您希望将
_
的两个实例都视为同一个参数,这不是_
的工作原理。表达式中每次出现的_
始终被视为唯一参数。