2016-04-26 67 views
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

那麼,我理解它嗎?

+0

是的,有什麼問題嗎? –

+0

因此,它現在改變'n',我的意思是,它在這裏把'n'看作一個變量。我認爲它是功能性的,但事實並非如此。這讓我感到困惑。 – hminle

+0

n不是一個變量,在這種情況下,「兩次(n)」是一個模式,並且你正在提取'n' –

回答

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 }