簡體   English   中英

如何在慣用的 Scala 中對其進行編碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM