我试图举一个例子来解释没有括号的占位符_可以表示(扩展到(任何类型的任意数量的参数,而不仅仅是可以表示任何类型的"只有一个"参数。但是,我所做的是不正确的,因为foreach的参数(函数文字(仍然只接受一个参数。
以下解释上述占位符规则的代码不正确。
我做了一个修改后的例子来简单地阐述这个规则。
val list1 = List(1,2,3)
val list2 = List((1,2),(3,4),(5,6))
val list3 = List((1,2,3),(4,5,6),(7,8,9))
scala> list1.foreach(println _) // _ is expanded to 1 parameter in each iteration
1
2
3
scala> list2.foreach(println _) // _ is expanded to 2 parameters in each iteration
(1,2)
(3,4)
(5,6)
scala> list3.foreach(println _) // _ is expanded to 3 parameters in each iteration
(1,2,3)
(4,5,6)
(7,8,9)
这也许能够更清楚地解释规则。
我希望这是正确的。
在《
Programming in Scala, 3rd Edition》一书的第8.6章部分应用函数中,一个例子显示:
val list = List(1,2,3)
list.foreach(x => println(x))
上下文说函数文字
println _
可以替代
x => println(x)
因为 _ 可以表示整个参数列表。
我知道下划线在自身和函数名称(在本例中为 println(之间留有空格,这意味着下划线表示整个参数列表。
但是,在这种情况下,原始函数文本中只有一个参数(每次迭代的 Int 元素(。
为什么本教程说 _ 表示整个参数列表?
函数文本
x => println(x) // Only one parameter? Where's the entire parameter list?
在
list.foreach(x => println(x))
显然只有一个参数,对吗?
为什么本教程说 _ 表示整个参数列表?
因为它谈论的是println
的整个参数列表。它只有一个参数。
你的意思是println _代表println(element1: Int, element2: Int, ...元素N:Int(
不。为了确定println _
的含义,我们查看其签名
def println(x: Any): Unit
"整个参数列表"是(x: Any)
,所以println _
和(x: Any) => println(x)
一样。如果你有def foo(x: Int, y: Int) = x + y
,那么foo _
将是(x: Int, y: Int) => foo(x, y)
。
注意:还有没有参数的重载def println(): Unit
,但编译器确定它在这里没有意义,因为foreach
期望一个具有单个参数的函数;但例如
val f: () => Unit = println _
println _
等同于() => println()
而不是(x: Any) => println(x)
。