簡體   English   中英

Scala中的模式匹配

[英]Pattern matching in Scala

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
                ^

也許有人可以在這里解釋我如何模式匹配?

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

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

問題是/%返回的15BigInt ,因此即使equals方法(由==調用)返回true,也不匹配文字Int 這有效,但有點不雅觀:

scala> BigInt(12) /% 7 match { case (x, y) if x == 1 && y == 5 => true }
res3: Boolean = true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM