我玩了一些占位符,发现了一个奇怪的案例:
val integers = Seq(1, 2)
val f = (x:Int) => x + 1
integers.map((_, f(_)))
Run Code Online (Sandbox Code Playgroud)
返回
Seq[(Int, Int => Int)] = List((1,<function1>), (2,<function1>))
Run Code Online (Sandbox Code Playgroud)
我在期待
Seq[(Int, Int)] = List((1, 2), (2, 3))
Run Code Online (Sandbox Code Playgroud)
如果我进行以下更改,一切都按预期工作:
integers.map(i => (i, f(i)))
Run Code Online (Sandbox Code Playgroud)
知道为什么f在映射期间不应用该函数吗?
下划线仅代表传递的参数一次.因此,integers.map((_, f(_)))第1个_是来自的值,integers但是第2个_具有"部分应用函数"的独立含义.
如果您的匿名函数需要2个(或更多)参数,那么您可以使用2个(或更多)下划线,但每个参数仅代表其传递的参数一次.