[英]Scala match case with multiple branch with if
我有一個與if
匹配的情況,表達式總是相同的。 我放了一些偽代碼:
value match {
case A => same expression
case B(_) if condition1 => same expression
case _ if condition2 => same expression
...
case _ => different expression //similar to an else
}
匹配包含兩個case object
( case A
)匹配和case class
( case B(_)
)
這是最佳做法嗎?
試着用文字解釋這段代碼。 “這個 function 返回兩個值之一。如果輸入是A
,則返回第一個值。或者如果輸入是B
類型並且條件成立。哦,或者如果不同的條件成立。否則,它是另一個值”。 這對我來說聽起來非常復雜。
我必須建議至少將其分解一下。 至少,您有兩個目標表達式,選擇哪一個取決於value
的某個謂詞。 對我來說,這聽起來像是Boolean
。 假設value
是某種特征類型Foo
( A.type
和B
擴展),你可以寫
sealed trait Foo {
def isFrobnicated: Boolean = this match {
case A => true
case B(_) if condition1 => true
case _ => condition2
}
}
...
if (value.isFrobnicated) {
same expression
} else {
different expression
}
現在認知負荷被分成兩個不同的、更小的代碼塊來消化,並且大概isFrobnicated
將被賦予一個自記錄的名稱和一大塊解釋為什么這種區別很重要的注釋。 閱讀底部片段的任何人都可以簡單地理解“哦,有兩個選項,基於 frobnication 狀態”,如果他們想要更多詳細信息,他們可以在isFrobnicated
文檔中閱讀 go 中的一些可愛的散文。 並且“ A
或B
如果這個或任何如果那個”的所有復雜性都被放入它自己的 function 中,與其他所有內容分開。
如果A
和B
沒有您控制的公共超類型,那么您始終可以編寫獨立的 function、 implicit
class 或(如果您使用 Scala 3)適當的擴展。 任你選。
根據您的實際用例,可能還有更多工作可以做,但這應該是一個開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.