我有一個匹配案例,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(_))
這是最佳做法嗎?
uj5u.com熱心網友回復:
試著用文字解釋這段代碼。“此函式回傳兩個值之一。如果輸入是A. 或者如果輸入是型別B并且條件成立,則回傳第一個值。哦,或者如果不同的條件成立。否則,它是另一個值”。這對我來說聽起來非常復雜。
我必須建議至少將其分解一下。至少,您有兩個目標運算式,選擇哪一個取決于value. 這對我來說聽起來很像Boolean。假設value是某種特征型別Foo(which A.typeand Bextend),你可以寫
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檔案中閱讀一些可愛的散文。A并且“或者如果這個或任何如果那個”的所有復雜性B都被投入到它自己的功能中,與其他一切分開。
如果A并且B沒有您控制的公共超型別,那么您始終可以撰寫獨立函式、implicit類或(如果您在 Scala 3 中)適當的擴展方法。任你選。
根據您的實際用例,可能還有更多作業可以做,但這應該是一個開始。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/498442.html
標籤:斯卡拉
下一篇:scala:集合物件是可變的嗎?
