0

エクストラクタとその使用について少し混乱しています。私は Scala ドキュメントを読んで、そのドキュメントに出会いました

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 App {
  val x = Twice(21)  // x = 42
  x match { case Twice(n) => Console.println(n) } // prints 21
}`

上記のコードが出力されるように、 を呼び出すとx match {case Twice(n) ...Twice(n)--> Twice.unapply(n)-->Twice.unapply(42)を取得し、Some(n/2)-->Some(42/2)結果をn再度プラグインして出力します。21

次のように「適用解除」を変更した場合: def unapply(z: Int): Option[Int] = if (z%2 == 0) Some(z - 2) else None

コンソールから得られるのは40

それで、私はそれを正しく理解していますか?

4

1 に答える 1

1

つまりTwice(n)--> Twice.unapply(n)-->Twice.unapply(42)

いいえ、Twice(n)はパターン (ここでは、式としても使用できますが、意味が異なります) でありTwice.unapply(n)、式です。そして、それはここでは意味をなさない表現です。なぜなら、あなたはnまだ値を持っていないからです! Twice.unapply(x)が代わりに呼び出されます。

x match { case Twice(n) => ...expression_using_n; ...other cases }基本的に同じです

Twice.unapply(x) match { 
  case Some(n) => ...expression_using_n
  case None => x match { ...other cases }
}

Someまたは、それ自体が抽出オブジェクトであるため、循環性を削除するには:

val unapplied = Twice.unapply(x)
if (unapplied.isDefined) {
  val n = unapplied.get
  ...expression_using_n
} else 
  x match { ...other cases }
于 2016-04-26T08:56:16.853 に答える