2012-01-04 33 views
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拉动:) – 2012-01-04 05:58:22

+1

http://stackoverflow.com/questions/7695270/underscore-in-list-filter(好),http ://stackoverflow.com/questions/4422016/scala-underscore-minimal-function,http://stackoverflow.com/questions/6593277/concise-notation-for-single-arg-anonymous-function-avoiding-underscore-not -wor – 2012-01-04 06:05:22

+0

(其实,我不知道是否有任何* *上下文,其中'_'是*不*神奇的*不同的方式* ...) – 2012-01-04 06:05:53

回答

6

占位符的语法的匿名功能的使用被限制为表达式。在你的代码中,你试图在与表达式不一样的赋值语句中使用通配符。

如果你在错误仔细观察,你可以看到你的任务的右手侧的表达式是什么被扩展为一个匿名函数。

鉴于你可能要考虑以下

userJars = userJars ++ JarBuilder.findContainingJar(clazz) 
+0

谢谢,有道理。尽管你的++解决方案不起作用,因为“findContainJar”返回一个选项[T]而不是一个列表[T] – Heptic 2012-01-05 02:52:41

+0

选项应该在需要时隐式转换为Iterable。这似乎在2.9.0.1中起作用 – 2012-01-05 04:21:29

相关问题