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