[英]How to code it in idiomatic Scala?
假設我想在 Scala 中編寫一個函數def pair(s:String):Option[(String, String)]
將字符串轉換為鍵值對。 該字符串應類似於"<key>:<value>"
。
您將如何更正下面的解決方案?
def pair(s:String) = { val a = s.split(":"); if (a.length == 2) Some((a(0).trim, a(1).trim)) else None }
我個人覺得兩種方法更好一些:
def pair(s: String) = s.split(":") match {
case Array(k, v) => Some(k.trim -> v.trim)
case _ => None
}
或者使用 Scala 方便的正則表達式提取器:
val Pair = """\s*([^\s:]+)\s*:\s*([^\s:]+)\s*""".r
def pair(s: String) = s match {
case Pair(k, v) => Some(k -> v)
case _ => None
}
但是,是的,你的也沒有那么糟糕。
我會刪除分號並使其成為兩行。 否則它是一個非常好的功能代碼。
乍一看,模式匹配似乎更合適一些:
def pair(s:String) =
s.split(":") match {
case Array(a, b) => Some((a, b))
case _ => None
}
在這種情況下模式匹配更適合的原因是您使用if-else
來模擬數據結構解構 - 確切地說,模式匹配適用於哪種。 這會驅使您進入更低的抽象級別、更多涉及的邏輯以及更多植入錯誤的機會。 因此,您的實現依賴於a(0)
中a(0)
部分函數,這始終是不鼓勵的做法。
部分函數是沒有為其輸入的整個域定義的函數。 在您的情況下,這意味着在空數組上調用a(0)
將導致異常,但不會產生有意義的功能結果。 在此特定示例中,您可以通過if
條件免受該場景的影響,但在更復雜的情況下,如果將此條件置於函數體之外,則部分函數的使用將成為潛在的錯誤。 這就是為什么不鼓勵將其作為一般做法的原因。
但我還必須提到,您不應普遍反對if-else
結構。 這是一個完全有效的函數表達式,有它的用途。 只是在這個特定示例中,它是一種次優方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.