2

我還是斯卡拉小白了,這讓我困惑:爲什麼此選項轉換爲字符串? [斯卡拉]

import java.util.regex._ 

object NumberMatcher { 
    def apply(x:String):Boolean = { 
    val pat = Pattern.compile("\\d+") 
    val matcher = pat.matcher(x) 
    return matcher.find 
    } 

    def unapply(x:String):Option[String] = { 
    val pat = Pattern.compile("\\d+") 
    val matcher = pat.matcher(x) 
    if(matcher.find) { 
     return Some(matcher.group()) 
    } 
    None 
    } 
} 

object x { 
    def main(args : Array[String]) : Unit = { 
    val strings = List("geo12","neo493","leo") 
    for(val string <- strings) { 
     string match { 
     case NumberMatcher(group) => println(group) 
     case _ => println ("no") 
     } 
    } 
    } 
} 

我想補充模式包含數字的字符串匹配(這樣我就可以瞭解更多有關模式匹配),並在unapply我決定返回Option[String]。但是,在NumberMatcher案例中的println中,group被視爲字符串,而不是Option。你能說出一些光明嗎?當這跑產生的輸出是:

12,493,no

回答

5

看看this example

unapply方法返回Some value如果它成功地提取一個,否則None。所以內部的

case NumberMatcher(group) => println(group) 

調用unapply,並期待它是否返回一些價值。如果是這樣,我們已經有了真正的結果,因此沒有Option類型。模式匹配從選項中提取返回的值。

+0

因此'unapply'只能返回一個'Option'類型?它不能直接返回一個字符串? – Geo 2009-12-14 20:17:02

+0

沒錯。無法直接返回字符串。如果確實如此,你會如何表明該模式不匹配。 – 2009-12-14 22:13:19

+0

未應用方法可以返回布爾值,在這種情況下,匹配塊的case子句使用空的模式參數列表。 – 2009-12-15 01:58:16

相關問題