2009-12-14 53 views
2

我試圖創建一個用於模式匹配的unapply方法,並且我試圖讓它返回與Option不同的東西,但是,Eclipse將該錯誤顯示爲錯誤。 unapply是否必須返回Option[T]這是一個規則,不適用總是會返回一個選項?

編輯:這是我正在嘗試使用的代碼。我交換代碼從上一節,以便unapply返回一個布爾

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):Boolean = { 
    val pat = Pattern.compile("\\d+") 
    val matcher = pat.matcher(x) 
    return matcher.find 
    } 
} 

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

的Eclipse說wrong number of arguments for object NumberMatcher。這是爲什麼?

回答

7

如果您想返回unapply,請將其返回Some。返回Boolean只是測試是否可以進行匹配。

這裏是一個模式匹配如何翻譯:

str match { 
    case NumberMatcher(group) => println(group) 
    case _ => println("no") 
} 

假設NumberMatcher回報Option[...],它會做:

val r1 = NumberMatcher.unapply(str) 
if (r1 != None) { 
    val group = r1.get 
    println(group) 
} else { 
    println("no") 
} 

如果NumberMatcher返回Boolean,那麼你可以把它收到東西。在這種情況下,這是發生了什麼:

str match { 
    case NumberMatcher() => println("yes") 
    case _ => println("no") 
} 

成爲

val r1 = NumberMatcher.unapply(str) 
if (r1) { 
    println("yes") 
} else { 
    println("no") 
} 

注意,這是一個很膚淺解釋。大小寫匹配可以測試常量,有更多的警戒條件,可選項,遞歸地使用unapply,使用unapplySeq等。這裏我只顯示了非常基本的用法來解決特定的問題。我強烈建議尋找模式匹配的更完整解釋。

7

再看看這個example。 我引用

的不應用的返回類型應該作如下選擇:
*如果它僅僅是一個測試,返回一個布爾值。例如case even()
*如果它返回一個T類型的子值,返回一個選項[T]
*如果你想返回幾個子值T1,...,Tn,將它們分組一個可選的元組選項[(T1,...,Tn)]。

+0

你能告訴我,我應該爲了修改爲不應用該返回一個布爾值工作? – Geo 2009-12-14 21:36:58

+0

返回布爾值時不能提取參數。這只是'NumberMatcher()=> ...'的情況。 – Dario 2009-12-15 10:58:26

+0

我很驚訝,Option [Unit]不起作用。 – 2012-09-15 17:46:38

1

當您將unapply定義爲返回Boolean時,表示該模式沒有任何匹配(或綁定)的通配符。因此,這位外交人員的案例陳述應該是case NumberMatcher => println(str),並給它一個填充變量是錯誤的。

或者,使case NumberMatcher(group) => println(group)您需要定義unapply()返回Option[String]

-2
package com.tutorial.extracters 
object ExtracterwithBooleanReturnType extends App { 
import java.util.regex._ 
object NumberMatcher { 
    def apply(x: String*) = { 
    x 
    } 
    def unapply(x: String): Option[Boolean] = { 
    val pat = Pattern.compile("\\d+") 
    val matcher = pat.matcher(x) 
    return Some(matcher.find) 
} 
} 

val strings = NumberMatcher("geo12", "neo493", "leo") 
for (str <- strings) { 
    str match { 
    case NumberMatcher(group) => println(group) 
    case _ => println("no") 
} 
} 
} 

,我們可以用上面的代碼,以及實現這一

+0

任何解釋 – tod 2015-03-03 06:46:02

相關問題