如何实际修复postfix Ops问题

时间:2015-10-19 17:12:09

标签: scala

我发现了几个关于Scala编译器警告主题的问题:

  应该通过隐式值启用后缀运算符xxx   scala.language.postfixOps可见。这可以通过添加   import子句' import scala.language.postfixOps'或者通过设置   编译器选项-language:postfixOps。有关值,请参阅Scala文档   scala.language.postfixOps用于讨论功能的原因   明确启用。

以下是此警告出现的示例:

val m1 = List(1->"a",2->"b") toMap

当我第一次遇到这个问题时,没有真正回答我想知道的事情:如何修复此问题没有涉及导入或编译器选项。我的第一个想法是:如果它不喜欢postfix操作,那么通过用点替换空格来使方法/ op调用显式。例如:

val m1 = List(1->"a",2->"b").toMap

不幸的是,当我第一次尝试修复时,我当时正在处理的代码看起来像这样:

val m2 = List(1->"a",2->"b") map {case (k,v) => (k.toString,v)} toMap

当我添加点时,这又导致了另一个模糊的编译器错误:

val m2 = List(1->"a",2->"b") map {case (k,v) => (k.toString,v)}.toMap
  

扩展函数缺少参数类型。的参数类型   匿名函数必须完全知道。 (SLS 8.5)预期类型是:?

k v 标识符相关。

那时候,我只是放弃并添加了import语句,一切都很顺利。然而,一位学生最近问我这个问题,我想我最好回去调查一下。看看我对这个问题的回答,现在我认为这个问题很明显。然而,我希望能够节省一些其他时间来浏览这个主题的所有其他讨论。

2 个答案:

答案 0 :(得分:3)

在这种情况下我通常做的是,我会在第一个电话中添加一个点:

val m2 = List(1->"a",2->"b").map {case (k,v) => (k.toString,v)}.toMap

就个人而言,我更喜欢这个有额外的括号。

答案 1 :(得分:1)

答案与操作员的关联性有关("。"绑定比地图更紧密)。答案当然是用括号覆盖绑定:

  val m2 = (List(1->"a",2->"b") map {case (k,v) => (k.toString,v)}).toMap