(println _) 中的下划线占位符如何表示其原始函数文字的整个参数列表?
How does the underscore placeholder in (println _) represent an entire parameter list of its original function literal?
我试着举例说明,不带括号的占位符_可以表示(扩展为)任意数量任意类型的参数,而不仅仅是可以表示任意类型的"only one"参数。但是,我做的那个是不正确的,因为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》第 3 版的第 8.6 章部分应用函数中,示例显示:
val list = List(1,2,3)
list.foreach(x => println(x))
上下文表示函数文字
println _
可以代替
x => println(x)
因为_可以代表整个参数列表。
我知道下划线在其自身和函数名称(在本例中为 println)之间留下 space 表示下划线代表整个参数列表。
然而,在这种情况下,原始函数文字中只有一个参数(每次迭代的 Int 元素)。
为什么本教程说 _ 代表整个参数列表?
函数字面量
x => println(x) // Only one parameter? Where's the entire parameter list?
在
list.foreach(x => println(x))
明明只有一个参数,对吗?
Why does this tutorial say _ represents an entire parameter list?
因为它讨论的是 println
的整个参数列表 。只有一个参数。
Do you mean println _ represents println(element1: Int, element2: Int, ... elementN: Int)
没有。为了确定 println _
的含义,我们查看 its signature
def println(x: Any): Unit
"The entire parameter list"是(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)
.
我试着举例说明,不带括号的占位符_可以表示(扩展为)任意数量任意类型的参数,而不仅仅是可以表示任意类型的"only one"参数。但是,我做的那个是不正确的,因为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》第 3 版的第 8.6 章部分应用函数中,示例显示:
val list = List(1,2,3)
list.foreach(x => println(x))
上下文表示函数文字
println _
可以代替
x => println(x)
因为_可以代表整个参数列表。
我知道下划线在其自身和函数名称(在本例中为 println)之间留下 space 表示下划线代表整个参数列表。
然而,在这种情况下,原始函数文字中只有一个参数(每次迭代的 Int 元素)。
为什么本教程说 _ 代表整个参数列表?
函数字面量
x => println(x) // Only one parameter? Where's the entire parameter list?
在
list.foreach(x => println(x))
明明只有一个参数,对吗?
Why does this tutorial say _ represents an entire parameter list?
因为它讨论的是 println
的整个参数列表 。只有一个参数。
Do you mean println _ represents println(element1: Int, element2: Int, ... elementN: Int)
没有。为了确定 println _
的含义,我们查看 its signature
def println(x: Any): Unit
"The entire parameter list"是(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)
.