【问题标题】:"Missing parameter type for expanded function" when using _ (underscore)?使用_(下划线)时“缺少扩展函数的参数类型”?
【发布时间】:2012-01-04 05:55:49
【问题描述】:

我经常遇到 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 错误吗?还是我做错了什么?

【问题讨论】:

  • _ 并不意味着你认为它意味着什么。在这种情况下,它是一个特殊 符号:任何其他简单的标识符都应该可以正常工作。由于这种魔力,Some(4).foreach(_ +: List())“工作正常”。要查看,请比较 Some(4).map(_ + 1)Some(4).map(x => x + 1)。希望这是重复的(并因此关闭),否则将从 SLS 中得到一个很好的答案:)
  • (实际上,我想知道是否存在 any 上下文,其中_不同的方式 具有魔力...)
  • 另外,可能很有趣,eta 扩展:Some(4).map(1 +)。而且“并不比 Java 复杂多少”....是的,对 :-)

标签: function scala syntax compiler-errors


【解决方案1】:

匿名函数的占位符语法的使用仅限于表达式。在您的代码中,您尝试在与表达式不同的赋值语句中使用通配符。

如果您仔细查看错误,您会发现赋值右侧的表达式正在扩展为匿名函数。

鉴于您要完成的工作,您可能需要考虑以下事项

userJars = userJars ++ JarBuilder.findContainingJar(clazz)

【讨论】:

  • 谢谢,有道理。尽管您的 ++ 解决方案不起作用,因为“findContainJar”返回的是 Option[T] 而不是 List[T]
  • 选项应在需要时隐式转换为 Iterable。这似乎适用于 2.9.0.1
猜你喜欢
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多