【问题标题】:Scala: where to put the @unchecked annotation in a foreachScala:将@unchecked注释放在foreach中的位置
【发布时间】:2012-05-08 22:22:19
【问题描述】:

我有以下几点:

samples.sliding(2).foreach{case List(a, b)=> printf("%x %x\n", a.value, b.value)}

我知道单个“案例”将匹配所有可能的值,但我收到“匹配并非详尽无遗”警告。 Scala 书解释了将 @unchecked 注释放在普通完全指定的匹配表达式上的位置,但不适用于上面的形式。如何注释上述内容以阻止编译器抱怨?

【问题讨论】:

    标签: scala foreach unchecked


    【解决方案1】:

    @unchecked为匹配操作中的选择器定义,而不是为任意函数定义。所以你可以

    foreach{ x => (x: @unchecked) => x match { case List(a,b) => ... } }
    

    但那是相当拗口。

    或者,您可以创建一种方法,将部分函数不安全地转换为完整函数(实际上只是转换为 PartialFunction 的函数超类):

    def checkless[A,B](pf: PartialFunction[A,B]): A => B = pf: A => B
    

    然后你就可以了

    samples.sliding(2).foreach(checkless{
      case List(a,b) => printf("%x %x\n", a.value, b.value)
    })
    

    你没有任何警告,因为它期待一个部分功能。

    【讨论】:

    • 我是在你发布之后才到的,无论如何谢谢 - 虽然我希望能获得一些代表点来回答我自己的问题 ;-) PF 到 CF 的转换很棘手,因为没有明确的演员表,虽然我看看它在做什么。感谢您的回答和无检查方法。
    【解决方案2】:

    不知道@unchecked,但为什么不直接打电话给x.headx.tail.headx(0)x(1)

    【讨论】:

    • 是的,这可行,但我更喜欢 Scala 的匹配运算符 :-)
    【解决方案3】:

    如果您确定它永远不会发生,为什么不添加一个虚拟案例?

    samples.sliding (2).foreach {
      case List (a, b) => printf ("%x %x\n", a.value, b.value)
      case _           => sys.error ("impossible")
    }
    

    【讨论】:

    • 因为我知道包罗万象永远不会被拿走,因此没有必要。我可以使用单独的 def 并注释它,如 ProgInScala 书的 p288 中所述,但我正试图弄清楚如何注释 foreach,正如我在问题中所说的那样。
    猜你喜欢
    • 1970-01-01
    • 2021-04-09
    • 2018-08-26
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2020-10-10
    相关资源
    最近更新 更多