1

我有一段代码,我收到来自 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 调用站点的什么位置?

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

4

3 回答 3

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
  }
}
于 2021-01-13T13:40:37.763 回答
1

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

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

使用此语法删除警告(对我而言)

于 2021-01-02T21:37:41.457 回答
1

我不太确定这有什么好处,但我认为这是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在 Scaladoc 中。代码在Scastie运行。

于 2021-01-11T14:11:11.730 回答