5
scala> (1,5) == BigInt(12) /% 7
res3: Boolean = true

scala> BigInt(12) /% 7 match {
 | case (1,5) => true
 | }

<console>:9: error: type mismatch;
found   : Int(1)
required: scala.math.BigInt
          case (1,5) => true
                ^

有人可以解释一下如何在这里进行模式匹配吗?

4

3 回答 3

9

match比平等更具体;你不能只是平等,你也必须有相同的类型。

在这种情况下,BigInt它不是一个案例类,并且unapply它的伴生对象中没有方法,所以你不能直接匹配它。你能做的最好的就是

  BigInt(12) /% 7 match {
    case (a: BigInt,b: BigInt) if (a==1 && b==5) => true
    case _ => false
  }

或其一些变体(例如case ab if (ab == (1,5)) =>)。

或者,您可以使用适当类型的 unapply 方法创建一个对象:

object IntBig { def unapply(b: BigInt) = Option(b.toInt) }

scala> BigInt(12) /% 7 match { case (IntBig(1), IntBig(5)) => true; case _ => false }
res1: Boolean = true
于 2012-11-11T18:55:44.143 回答
1

1并且5Int类型。模式匹配需要一个scala.math.BigInt. 因此,通过为 1 和 5 声明几个 val 来实现这一点。

scala> val OneBig = BigInt(1)
oneBig: scala.math.BigInt = 1

scala> val FiveBig = BigInt(5)
fiveBig: scala.math.BigInt = 5

scala> BigInt(12) /% 7 match {
     | case (OneBig, FiveBig) => true
     | }
res0: Boolean = true
于 2012-11-11T18:56:02.987 回答
0

问题是1and5返回/%are s,因此即使方法(由 调用)返回 true BigInt,也不匹配文字s。这可行,但有点不雅:Intequals==

scala> BigInt(12) /% 7 match { case (x, y) if x == 1 && y == 5 => true }
res3: Boolean = true
于 2012-11-11T18:55:37.317 回答