在使用下划线时出现“扩展函数缺少参数类型”?

6

我在使用Scala时经常遇到的一个问题是lambda表达式。例如:

JarBuilder.findContainingJar(clazz).foreach {userJars = userJars + _ }

会给我一个错误,例如:
missing parameter type for expanded function ((x$1) => userJars.$plus(x$1))

如果我自己进行扩展,那么:
JarBuilder.findContainingJar(clazz).foreach {x => userJars = userJars + x }

它运行得很好。

这是Scala的错误吗?还是我做错了什么?


1
在这里,“”不是你想象中的意思。在这种情况下,它是一种特殊符号:任何其他简单标识符都应该可以正常工作。由于这种魔力,“Some(4).foreach( +: List())”“可以正常工作”。比较一下“Some(4).map(_ + 1)”和“Some(4).map(x => x + 1)”即可看到。希望这是一个重复的问题(并已被关闭),或者会有一个漂亮的答案,从SLS中查找 :) - user166390
1
https://dev59.com/_2sz5IYBdhLWcg3wuKa7(好的),https://dev59.com/yG855IYBdhLWcg3wUCWC,https://dev59.com/dVjUa4cB1Zd3GeqPV_P8 - user166390
实际上,我想知道是否存在任何上下文环境,其中“_”不以不同的方式成为神奇的东西... - user166390
此外,可能会有趣的是 eta 扩展:Some(4).map(1 +)。还有,“不比 Java 复杂多少”.... 是啊,好吧 :-) - user166390
1个回答

6
占位符语法只能用在表达式中的匿名函数中。在你的代码中,你试图在赋值语句中使用通配符,但这不同于表达式。
如果你仔细看错误信息,你可以看到右边的表达式正被展开成一个匿名函数。
然而,考虑到你想要实现的目标,你可能需要考虑以下内容。
userJars = userJars ++ JarBuilder.findContainingJar(clazz)

谢谢,很有道理。虽然你的++解决方案不起作用,因为“findContainJar”返回的是Option[T]而不是List[T]。 - Heptic
当需要时,应将选项隐式转换为Iterable。这似乎在2.9.0.1中可以工作。 - Neil Essy

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