2012-11-18 68 views
2

我是斯卡拉新手,並試圖理解匹配。斯卡拉匹配變量傳遞

當我試圖運行下面的代碼時,javaw進程VM不響應(保持永遠的等待 - 從日食嘗試此)

case GenericProfile(user) => processGenericProfile(_) 
case _ => println("Invalid data found") 

然而,下面的部分工作得很好:

case GenericProfile(user) => processGenericProfile(GenericProfile(user)) 
case _ => println("Invalid data found") 

我想了解爲什麼第一種情況無法響應。我不想傳遞GenericProfile(用戶) - 我想知道這可以簡化。 Thnaks!

回答

8

沒有看到如何processGenericProfileGenericProfile定義它很難說肯定的,但我覺得你的第一種情況(case GenericProfile(user) => processGenericProfile(_))只是返回一個部分應用功能processGenericProfile,而不是把它應用到結果的情況下的左手我明白你想要做......

考慮這個REPL會話,在這裏我給出processGenericProfile「假」的定義和GenericProfile

scala> case class GenericProfile(user: String) 
defined class GenericProfile 

scala> def processGenericProfile(u: GenericProfile) = "processed" 
processGenericProfile: (u: GenericProfile)java.lang.String 

scala> GenericProfile("Paolo") match { 
    | case GenericProfile(user) => processGenericProfile(_) 
    | case _ => "wrong" 
    | } 
res0: java.lang.Object = <function1> 

match的返回類型?這可能是因爲你沒有被卡住,匹配返回一個函數並且不會應用它,所以你正在等待一些事情發生,但是Scala認爲它已經完成了你想要做的事(返回一個函數)。

如果您需要捕獲整個GenericProfile,而不僅僅是用戶它包含,你可以use an alias@符號,例如:

scala> GenericProfile("Paolo") match { 
     | case u @ GenericProfile(user) => processGenericProfile(u) 
     | case _ => "wrong" 
     | } 
    res2: java.lang.String = processed 

最後一件事。我不確定case GenericProfile(user)中的「用戶」是什麼。我編寫它的方式是一個與GenericProfile中包含的值綁定的名稱。即在第一種情況下我們說:「如果我們正在檢查的項目是GenericProfile,把它包含字符串(」在這種情況下,保羅」),並將其綁定到一個名字user

既然你不使用在右邊的那個值,你也可以這樣做:

case u @ GenericProfile(_) => processGenericProfile(u) 

,其中在左側_使得它明確的是你丟棄匹配的用戶,你是在檢查只是有興趣的是,類型是GenericProfile

如果相反,「用戶」是您先前定義的變量(即您希望你的病例陳述檢查你是否有一個GenericProfile),那麼你需要告訴斯卡拉user是你定義的東西,而不是你想要綁定到GenericProfile中的任何名字。這可以通過surrounding your identifier (user) with backticks來完成,像這樣:

val user="Paolo" 

GenericProfile("Paolo") match { 
    case u @ GenericProfile(`user`) => processGenericProfile(u) 
               //now this only matches      
               //GenericProfile("Paolo") 
    case GenericProfile(_) => "not Paolo"  
    case _ => "wrong" 
} 
+0

你說得對 - 我在不知不覺中使用了部分函數。感謝您的詳細回覆 - 鼓舞人心的! – felixmd