Функциональный подход для применения сопоставленных аргументов к параметрам по умолчанию / именованным параметрам - PullRequest
3 голосов
/ 13 сентября 2011

Мне предоставлена ​​библиотека с функцией компоновщика, использующей параметры по умолчанию / именованные. Что-то вроде

def builder = new {
    def apply(
      a:Int = 0,
      b:Int = 0,
      c:Int = 0):String = {
       "a="+a+", b="+b+", c="+c
      }
}

Мне нужно использовать Mapped Collection параметров (параметры HTTP-запроса) и правильно вызывать конструктор. Я могу грубо заставить его повторять код, но для этого должен быть лучший «функциональный» способ. Ниже моя довольно неудачная попытка. Как вы можете видеть, он переопределяет стандартные параметры строителя. Пожалуйста, покажи мне свет!

val inParams = Map("a" -> 1, "b" -> 2, "c" -> 3) //3 params passed in

builder(
  in.get("a").getOrElse(0),
  in.get("b").getOrElse(0),
  in.get("c").getOrElse(0)
)

val inParams = Map("a" -> 1, "c" -> 3) //2 params, out of sequence
builder(
  in.get("a").getOrElse(0),
  in.get("b").getOrElse(0),
  in.get("c").getOrElse(0)
)

Ответы [ 3 ]

3 голосов
/ 13 сентября 2011

Map имеет метод getOrElse.

val in = Map("a" -> 1, "c" -> 3) //2 params, out of sequence
builder(
  in.getOrElse("a", 0),
  in.getOrElse("b", 0),
  in.getOrElse("c", 0)
)

Или вы также можете сделать:

val in = Map("a" -> 1, "c" -> 3).withDefaultValue(0)
builder(in("a"), in("b"), in("c"))
0 голосов
/ 13 сентября 2011

Полагаю, это лишь небольшое улучшение ...

def mapping[A](s:String, m:Map[String,A], d:A):Seq[A] = 
  s.map(k => m.getOrElse(k.toString,d))

val in = Map("a" -> 1, "c" -> 3)
val Seq(a,b,c) = mapping("abc", in, 0)
builder(a,b,c)
0 голосов
/ 13 сентября 2011

Вот то, что я придумал - я знаю, не очень; улучшения приветствуются.

val Seq(a, b, c) = Seq("a", "b", "c").map(p => inParams.getOrElse(p, 0))
builder(a, b, c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...