我努力實現「簡單」行爲:將模式匹配代碼分成兩個獨立的函數。模式匹配:使用PartialFunction分割代碼?
我簡化了清晰的目的模型:
abstract class Animal
case object Dog extends Animal
case object Cat extends Animal
case object Bird extends Animal
case object Bat extends Animal
case object Dolphin extends Animal
我想對這些功能的不同模式匹配(因爲實際的代碼是很長),但也有其他參數,以便PartialFunctions是給我有病......
在一個完美的世界,我可以這樣寫:
type PF = PartialFunction[(Animal, Int, String), String]
private def processFlying(a: Animal, n: Int, loc: String): PF = {
a match {
case Bird => n + " birds found in " + loc
case Bat => n + " bats found in " + underground(loc)
}
}
private def processMarine(a: Animal, n: Int, loc: String): PF = {
a match {
case Dolphin => n + " dolphins found in " + submarine(loc)
}
}
private def processPet(a: Animal, n: Int, loc: String): PF = {
a match {
case Dog => n + " dogs found in " + loc
case Cat => n + " cats found in " + loc
}
}
def processAnimal(a: Animal, number: Int, location: String) = {
val processAll = processFlying orElse processMarine orElse processPet
processAll(a, n, location)
}
但是不起作用。主要是因爲我需要在我的函數中有幾個參數。 「爲什麼你不使用元組?」你可以說?嗯,我嘗試和編譯器將不會停止抱怨預期的類型比實際的類型不同,不同的到我的別名:(
任何幫助,建議,或可替代的IDE將是有用的!
乾杯
編輯: 我跟着西里爾的答案BU我還需要在比賽前進行了一些工作,像這樣:
val processFlying: PF = {
// doSomething, like declare a sub-function f
{
case (b: Bird, n, loc) => f(b)
case (b: Bat, n, loc) => f(b)
}
}
爲什麼你的子功能需要在'val'內?難道不可以,旁邊說一個'私人的def'嗎? –
這就是我所做的,但我不需要它在其他地方,所以...... :) 此外,我想通過使用閉包來利用它。這是熱情,現在看起來事情很好。但如果任何人有解決方案,我會保持知道 –