沒有看到如何processGenericProfile
和GenericProfile
定義它很難說肯定的,但我覺得你的第一種情況(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"
}
你說得對 - 我在不知不覺中使用了部分函數。感謝您的詳細回覆 - 鼓舞人心的! – felixmd