能否在Scala case-class匹配中使用命名参数?

6
假设有一个 Scala 的 case-class Point
case class Point(x: Int, y: Int)

可以使用通配符进行匹配:

val p = new Point(1,2)
val inRightHalfPlane = p match {
  case Point(x, _) if x>0 => true
  case _ => false
}

然而,如果成员数量增加,就需要使用更多的通配符 _:

case class Point(
  x0: Int,
  x1: Int,
  x2: Int,
  x3: Int,
  x4: Int,
)


val flag = p match {
  case Point(x,_,_,_,_,) if x>0 => true
  ......
}

有没有类似下面代码的语法糖?
val flag = p match {
  case Point(x0=x) if x>0 => true
  ......
}

7
我知道的最接近的是case p: Point if (p.x0) => true。我同意你建议的方式会更好。 - Luis Miguel Mejía Suárez
3
这里有一个相关的讨论链接 - Andrey Tyukin
1
记录的问题单链接为 https://github.com/scala/bug/issues/6524。 - Seth Tisue
1个回答

7
您可以定义自定义的 unapply
  case class Point(
                    x0: Int,
                    x1: Int,
                    x2: Int,
                    x3: Int,
                    x4: Int,
                  )

  object PositiveFirst {
    def unapply(p: Point): Option[Int] = if (p.x0 > 0) Some(p.x0) else None
  }

  val p: Point = ???

  val flag = p match {
    case PositiveFirst(x) => true
//      ......
  }

def unapply(p: Point): Boolean = p.x0 > 0 ... case PositiveFirst => true - fshp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接