【问题标题】:How to actually fix the postfix Ops issue如何实际解决 postfix Ops 问题
【发布时间】:2016-01-18 03:21:30
【问题描述】:

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

后缀运算符 xxx 应该通过设置隐式值来启用 scala.language.postfixOps 可见。这可以通过添加 导入子句“import scala.language.postfixOps”或通过设置 编译器选项 -language:postfixOps。请参阅 Scala 文档以获取价值 scala.language.postfixOps 讨论为什么该功能应该是 明确启用。

以下是显示此警告的示例:

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

当我第一次遇到这个问题时,没有人真正回答我想知道的问题:如何在不涉及导入或编译器选项的情况下解决这个问题。我的第一个想法是:如果它不喜欢后缀操作,那么通过用点替换空格来使方法/操作调用 explicit。例如:

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) 预期类型为:?

这与 kv 标识符有关。

那时,我只是放弃并添加了 import 语句,一切都很好。但是,最近有一个学生问我这个问题,我想我最好回去调查一下。看看我对这个问题的回答,现在我想起来了,这是相当明显的。然而,我希望为其他一些人节省时间,让他们可以花时间完成所有其他关于该主题的讨论。

【问题讨论】:

    标签: scala


    【解决方案1】:

    在这种情况下我通常会做的,我会在第一次调用中添加一个点:

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

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

    【讨论】:

    • 确实,这也有效。也许它更优雅一些。
    【解决方案2】:

    答案与运算符的关联性有关(“.”比 map 绑定得更紧密)。答案当然是用括号覆盖绑定:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 2014-11-25
      • 2022-01-20
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      相关资源
      最近更新 更多