2

http://www.scala-lang.org/node/112でコードを試していますが、何かをスローするように見えないものに対して一致エラーが発生します。

これは元のコードです:

object Twice {                              
  def apply(x: Int): Int = x * 2
  def unapply(z: Int): Option[Int] = if (z%2 == 0) Some(z/2) else None
}

object TwiceTest extends Application {
  val x = Twice(21)
  x match { case Twice(n) => Console.println(n) } // prints 21
}

奇数を渡すとどうなるかをテストするために、数行追加しました。

object TwiceTest extends Application {
  val x = Twice(21)
  x match { case Twice(n) => Console.println(n) } // prints 21
  val y = 21
  y match { case Twice(n) => Console.println(n) } // throws scala.MatchError: 21 (of class java.lang.Integer)
}

私が知る限り、21 または任意の奇数の場合も、オブジェクトの unapply メソッドで処理する必要があります。なぜそうではないのか、誰かが説明できますか?

4

2 に答える 2

6
val x = Twice(21)

と同じです

val x = Twice.apply(21)

xに等しいことを意味し42ます。はTwice.unapply(42)を返します。これは、 が値と正常に一致したSome(21)ことを意味します。case Twice(21)x == 42

matchこれが、最初のステートメントが出力される理由21です。

Twice.unapply(21)が返されますNone(が奇数y == 21の場合)。が何らかの値を返すyときはいつでも、そのメソッドを持つ抽出オブジェクトがその値と一致しないと言います。unapplyNoneunapply

matchステートメントが値とそのケースのいずれにも一致しない場合、MatchError.

于 2012-06-25T14:06:53.383 に答える
2

それはあなたのunapplyメソッドによって処理されていますが、match. あなたunapplyは を返すはずなので、 をNone満たしていないことを意味しますcase Twice(n)

次のようなものに変更します

21 match {
  case Twice(n) => println("this won't happen")
  case x => println("just " + x)
}
于 2012-06-25T14:05:29.943 に答える