Судите его с точки зрения написания кода идиоматического, эффективный код и т.д.Каков наилучший способ написать этот метод scala?
У меня есть несколько способов, определенные ниже получить значение конфа от getConf1, getConf2, или getConf3 какой успешно возвращающего значения первым при вызове в таком порядке. Другими словами, если getConf1 дает значение, мы пропустим оставшиеся два. Если getConf1 не дает значения, мы попробуем getConf2 и так далее.
def getConf1(name: String): Option[String]
def getConf2(name: String): Option[String]
def getConf3(name: String): Option[String]
Подход 1:
def getSetting(name: String): Option[String] = {
var r = getConf1(name)
if(!r.isDefined) {
r = getConf2(name)
}
if(!r.isDefined) {
r getConf3(name)
}
r
}
Подход 2:
def getSetting(name: String): Option[String] = {
val val1 = getConf1(name)
val val2 = getConf2(name)
val val3 = getConf3(name)
(val1, val2, val3) match {
case (a: Some[String], _, _) => a
case (_, a: Some[String], _) => a
case (_, _, a: Some[String]) => a
case _ => None
}
}
Подход 3:
def getSetting(name: String): Option[String] = {
val myList = List(
(n:String) => getVal1(n),
(n:String) => getVal2(n),
(n:String) => getVal3(n))
doConditionally(name, myList)
}
def doConditionally[T1, T2](name: T1, list: List[(T1) => Option[T2]]): Option[T2] = {
list match {
case h::t =>
val r = h(name)
if(r.isEmpty) {
doConditionally(name, t)
} else {
r
}
case Nil =>
None
}
}
Вы имеете в виду 'getConf1 (имя) OrElse getConf2 (имя) OrElse getConf3 (имя)'. – Jubobs
Да. Обновление! :) – jkinkead
Я собираюсь сказать: Красиво! – Mike