【问题标题】:Higher-order, partial function — where to place @unchecked annotation?高阶部分函数——在哪里放置@unchecked注解?
【发布时间】:2021-04-09 02:00:21
【问题描述】:

我有一段代码收到来自 Scala 2.13.4 的“匹配可能并不详尽”警告,我想使用@unchecked 抑制该警告注解。不幸的是,我插入@unchecked 的所有尝试都只是导致语法错误。

这是原始代码的无情简化版:

def foo(xs: Seq[Int], n: Int)(f: (Seq[Int], Int) => Int): Int = f(xs, n)
    
foo(Seq(1,2), 0) { case (Seq(a,b), c) => a + b + c }

问题:为了抑制警告,我应该将@unchecked 在调用站点的语法放在哪里?

附注我想压制警告,而不是开始讨论这是否是邪恶的;-)

【问题讨论】:

  • 我不确定我是否正确,但我无法重现它:scastie.scala-lang.org/toshetah/jujYc1IDTx20lIRZSGjPBA/3
  • @TomerShetah 有趣 - 我会检查项目的编译器选项是什么,也许那里有什么特别之处。不管怎样,我还是想知道把@unchecked放在哪里。
  • @TomerShetah 不需要重现警告:如果您设法挤入@unchecked 而不会导致编译器错误,那么您已经帮助了我:-)
  • 我希望我的代码中有足够的未经检查的内容来帮助你:)

标签: scala pattern-matching compiler-warnings suppress-warnings non-exhaustive-patterns


【解决方案1】:

在 IntelliJ 的编译器选项中启用“未选中”后,我没有收到警告。这不是scalastyle,是吗? 我很欣赏你的例子是人为的。这些方法中的任何一种都适合您吗?

选项 1:将柯里化函数定义为 PartialFunction

def foo(xs: Seq[Int], n: Int) (f: PartialFunction[(Seq[Int], Int), Int]): Int = 
    if(f.isDefinedAt(xs, n))
        f(xs, n)
    else 0

选项 2:将 case 语句转换为匹配表达式?

foo(Seq(1,2), 0) {
  (_:(Seq[Int], Int) @unchecked) match
  {
    case (Seq(a, b), c) => a + b + c
  }
}

【讨论】:

【解决方案2】:

我不确定这有什么好处,但我认为这是您在问题代码中可以做的最大unchecked

def foo(xs: Seq[Int @unchecked] @unchecked, n: Int @unchecked)(f: (Seq[Int @unchecked] @unchecked, Int @unchecked) => Int @unchecked): Int @unchecked = {
  f(xs, n)
}

println(foo(Seq(1,2), 0) {
  case (Seq(a: Int @unchecked,b: Int @unchecked), c: Int @unchecked) => a + b + c
})

unchecked in Scaladoc。代码在Scastie 运行。

【讨论】:

  • 这确实是很多@unchecked :-) 这些抑制检查foo 的每次使用(因为它们被放置在定义站点),但我想要抑制的是在调用点进行检查,其中存在隐式模式匹配——在调用点——以偏函数的形式作为第二个参数传递给foo。我已经澄清了我的问题,如果我自己找到解决方案,我会尽快回复您。
  • @MalteSchwerhoff,我是否更新了我的答案。这对你有帮助吗?
  • 我看到你喜欢挑战 :-) 不幸的是,它没有帮助,可能是因为注释影响序列的元素,而不是序列本身。 IE。他们不会压制关于不匹配任意大小序列的抱怨。很明显,盲目调试(因为你没有得到编译器警告)并不理想。不幸的是,我还没有设法提炼出一个仍然引起警告的足够小的例子:-/
【解决方案3】:

不确定我是否理解正确,但您是否尝试过这样的事情:

def pie(x: Option[String]) =
(x: @unchecked) match {
  case Some(v) => v
}

使用这种语法删除警告(对我来说)

【讨论】:

  • 我也设法让它在这个相当简单的情况下工作,但对于问题中显示的更复杂的代码却失败了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多