Scala - 提取器对象混淆
Scala - Extractor Objects confusion
我对提取器及其使用有点困惑。我阅读了 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
如果我按如下方式更改 "unapply":
def unapply(z: Int): Option[Int] = if (z%2 == 0) Some(z - 2) else None
我从控制台得到的是40
那么,我理解的对吗?
it means 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 }
我对提取器及其使用有点困惑。我阅读了 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
如果我按如下方式更改 "unapply":
def unapply(z: Int): Option[Int] = if (z%2 == 0) Some(z - 2) else None
我从控制台得到的是40
那么,我理解的对吗?
it means
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 }