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 に対して 2 つの 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

問題は、によって返される1andが areであるため、メソッド (によって呼び出された) が true を返しても、リテラルの s と一致しないことです。これは機能しますが、少し洗練されていません:5/%BigIntIntequals==

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