2012-11-11 190 views
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 
       ^

有人可能會解釋我如何模式匹配在這裏?斯卡拉模式匹配

回答

10

match比平等更具體;你不能只是平等的,你也必須具有相同的類型。

在這種情況下,BigInt不是案例類別,並且在其伴侶對象中沒有unapply方法,因此您無法直接在該對象上進行匹配。你能做的最好的是其(例如case ab if (ab == (1,5)) =>

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

或其變型。

或者,可以用適當的類型的取消應用方法創建一個對象:

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 
+0

綁定到變量和警衛是我做的。我只是覺得它可能會做得更好一點。謝謝。 – marcus

1

的問題是,1/%返回5BigInt S和SO不匹配字面Intš即使equals法(==調用)返回true。這工作,但有點不雅:

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

15Int類型。模式匹配期望scala.math.BigInt。所以,通過宣佈一個和五個vals。

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

這不行!模式中的「oneBig」和「fiveBig」是與之前定義的變量無關的新變量。這可以通過用大寫字母('OneBig'和'FiveBig')命名或通過反引號將名稱包圍來改變。 –

+0

謝謝。忘了那個。對於那些有興趣的人,請參閱樓梯書的http://stackoverflow.com/questions/4479474/scala-pattern-matching-with-lowercase-variable-name或page 317。 – Brian