Scala中的模式匹配

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
                ^

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

3个回答

9

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

在这种情况下,BigInt不是一个case类,并且在其伴生对象中没有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

绑定变量和使用守卫是我所做的。我只是认为可能可以做得更好一些。谢谢。 - user1602492

1

15Int类型。模式匹配期望的是一个scala.math.BigInt,因此通过声明一个或两个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

3
这行代码有问题!模式中的 oneBigfiveBig 是新变量,与之前定义的变量无关。可以通过将它们命名为大写字母(OneBigFiveBig)或用反引号括起来以解决此问题。 - Alexey Romanov
谢谢。我忘了那个。对于那些感兴趣的人,请参见https://dev59.com/m2855IYBdhLWcg3wMRVW或楼梯书的第317页。 - Brian

0
问题在于由 /% 返回的 1 5 BigInt ,因此与字面意义上的 Int 不匹配,即使 equals 方法(由 == 调用)返回true。 这个方法可以工作,但有点不太优雅:
scala> BigInt(12) /% 7 match { case (x, y) if x == 1 && y == 5 => true }
res3: Boolean = true

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