2013-06-24 77 views
1

誰能告訴我如何重寫這段代碼以避免冗餘部分?模式匹配沒有冗餘的陣列

val lineSplit = line.split(" ") 
     lineSplit match { 
     case Array(cls @ TaggedString(), prop @ TaggedString(), value @ Literal(), ".") => {processProperty(prop);processLiteral(value)} 
     case Array(cls @ TaggedString(), prop @ TaggedString(), value @ LiteralwithSchema(), ".") => {processProperty(prop);processExtendedLiteral(value)} 
     case Array(cls @ TaggedString(), prop @ TaggedString(), value @ TaggedString(), ".") => {processProperty(prop);processTag(value)} 
     case _ => throw new IllegalArgumentException("unable to identify line format") 

     } 

因爲您可能已經看到提取屬性的部分始終是相同的。 你有什麼想法如何充分考慮到這一部分?

THX您的輸入,

斯特凡

回答

1

在你的情況我只是加倍的比賽(儘管也可以編寫自定義提取器),避免重複返回做的工作函數:

def badLine() = throw new IllegalArgumentException("unable to identify line format") 
lineSplit match { 
    case Array(cls @ TaggedString(), prop @ TaggedString(), x, ".") => 
    val processValue = x match { 
     case value: Literal() =>() => processLiteral(value) 
     case value: LiteralwithSchema() ... 
     ... 
     case _ => badLine() 
    } 
    processProperty(prop) 
    processValue() 
    case _ => badLine() 
} 
+1

哇。正是我所期待的。謝謝! –

0
val lineSplit = line.split(" ") 
    lineSplit match { 
    case Array(cls @ TaggedString(), prop @ TaggedString(), value @ Literal(), ".") => {processProperty(prop);processValue(value)} 
    case _ => throw new IllegalArgumentException("unable to identify line format") 
    } 

def processValue(x: String): String = { 
    x match { 
     case Literal() => processLiteral(x) 
     case LiteralwithSchema() => processExtendedLiteral(x) 
     case TaggedString() => processTag(x) 
     case _ => throw new IllegalArgumentException("value has an unknown format!") 
    } 

我決定要素價值搬運出來這對我來說更容易感覺的方法。 現在看這個問題這個問題感到有點尷尬現在哈哈。 }