Scala下划线的解释

5

请看以下这些Scala代码片段:

如果我们有类似下面的代码:
List(List(1, 2), List(3, 4), List(5)) map (x => (x.size))

我们可以将其缩短为:
List(List(1, 2), List(3, 4), List(5)) map ((_.size))

但是,如果我们有这样的东西:

List(List(1, 2), List(3, 4), List(5)) map (x => (x.size, x.size))

为什么我们不能将其缩短为:
List(List(1, 2), List(3, 4), List(5)) map ((_.size, _.size))

?


有趣的问题,我会留在这里查看答案。 - SCouto
2个回答

5

占位符的数量应该等于函数参数的数量。在你的情况下,map只有一个参数,所以你不能使用两个占位符。


请给我一个例子,让我可以在表达式的右侧得到 map ((_.size, _.size)) - GA1
1
@GA1 你不能在map方法中使用两个占位符。使用两个占位符的示例:List(1,2,3,4).reduce(_ + _) - 对列表元素求和。 - Sergii Lagutin
无论如何,我真的很喜欢这个问题的答案https://dev59.com/bYPba4cB1Zd3GeqPp0JB 特别是涉及语言学的部分。 我仍然不明白为什么编译器不允许: List(List(1, 2), List(3, 4), List(5)) map ((_.size, _.size)) 它的基本原则是什么? 这个功能会带来什么“危险”? - GA1
1
@GA1 List(List(1, 2), List(3, 4), List(5)) map ((_.size, _.size)) 这段代码会做什么?map 接受一个类型为 List[Int] 的操作数。 - Yuval Itzchakov
我希望它返回与以下代码相同的结果: List(List(1, 2), List(3, 4), List(5)) map (x => (x.size, x.size)) - GA1
2
@GA1 在Scala中没有这样做的方法。这不是因为“危险”,而是由于函数简写中_的工作方式。每个参数在主体中只能使用一次下划线。要获得(_.size, .size)的等效形式,您必须使用完整的函数签名或映射到.size,并将结果列表转换为具有重复条目的元组。 - eques

2

因为List(List(1,2),List(3,4),List(5))map((_.size,_.size))有不同的含义,即

List(List(1, 2), List(3, 4), List(5)) map ((x => x.size, y => y.size))

你可以从错误信息中看出这一点。显然,这段代码无法编译,因为map不能接受包含两个函数的元组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接