我有一種情況,我正在使用函式對規則應用程式進行建模,每個函式都回傳應用時將采取的操作,或者,如果無法應用規則,則回傳空串列。我有一些我想按順序嘗試并短路的規則。在我習慣的其他語言中,我會將空序列視為 false/None 并用 鏈接它們orElse,如下所示:
def ruleOne(): Seq[Action] = ???
def ruleTwo(): Seq[Action] = ???
def ruleThree(): Seq[Action] = ???
def applyRules(): Seq[Action] = ruleOne().orElse(ruleTwo).orElse(ruleThree)
但是,據我了解,這不會起作用,實際上會做一些我期望之外的事情。
我可以使用returnwhich讓我感覺不好,或者更糟糕的是,嵌套if陳述句。if let在這里會很棒,但 AFAICT Scala 沒有。
這里的慣用方法是什么?
uj5u.com熱心網友回復:
你在這里有不同的方法。其中一個是組合 Seq 中的所有操作(因此創建 a Seq[Seq[Action]])然后使用find(它將回傳與給定條件匹配的第一個元素)。因此,例如:
Seq(ruleOne, ruleTwo, ruleThree).find(_.nonEmpty).getOrElse(Seq.empty[Action])
我不清楚您的域應用程式,但最后一個允許getOrElse轉換Option由find. Seq這種方法雖然評估了所有序列(沒有短路)。
另一種方法是使用一種模擬您使用 pimp my library/extensions 方法Seq的想法的方法來豐富:orElse
implicit class RichSeq[T](left: Seq[T]) {
def or(right: => Seq[T]): Seq[T] = if(left.isEmpty) { right } else { left }
}
by name 引數啟用短路評估。實際上,僅當左序列為空時才計算右序列。
Scala 3 對這種抽象有更好的語法:
extension[T](left: Seq[T]){
def or(rigth: => Seq[T]): Seq[T] = if(left.nonEmpty) { left } else { rigth }
}
這樣,您可以呼叫:
ruleOne or ruleTwo or ruleThree
scala 2 的 Scastie
scala 3 的 Scastie
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/413337.html
標籤:
上一篇:async await的理解
