严格地说,第一
是
界定界限的正确方式;varargs并不意味着参数的类型不同,只意味着参数的数量不同。
使用各种类型实现所需的方式更复杂,需要打包
Show
实例和值。E、 g。
case class HasShow[A](x: A)(implicit val ev: Show[A])
def appendOptional(to: Map[String, String], values: (String, Option[HasShow[_]])*): Map[String, String] =
values.foldLeft(values) {
// value.ev.show(value.x)) can be extracted into a method on HasShow as well
case (collector, (key, Some(value: HasShow[a]))) =>
collector + (key -> value.ev.show(value.x))
case (collector, _) => collector
}
val props = appendOptional(initial, "name" -> name.map(HasShow(_)), "age" -> age.map(HasShow(_)))
您可以为
HasShow
简化呼叫站点,但通过这种方式,您可以更好地了解正在发生的事情。
对于这种特殊情况,我认为更好、更简单的解决方案是
implicit class MapOp(self: Map[String, String]) extends AnyVal {
def appendOptional[A: Show](key: String, value: Option[A]) =
value.fold(self)(x => self + (key -> Show.show(x)))
}
val props = initial.appendOptional("name", name).appendOptional("age", age)