我发现了几个关于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语句,一切都很顺利。然而,一位学生最近问我这个问题,我想我最好回去调查一下。看看我对这个问题的回答,现在我认为这个问题很明显。然而,我希望能够节省一些其他时间来浏览这个主题的所有其他讨论。
答案 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