我有configurer支持链样式,如下所示:

val configurer = Configurer("init").propA("a").propB(3).propC("bla-bla")


这是我无法更改的第三方音乐库。

我有我的


案例类Config(propA:Option [String],propB:Option [Int],propC:
选项[字符串])


现在,我需要使用给定的configurer对象构建我的config,如果在propX中设置了相应的值,则应调用方法config

以功能方式做到这一点的最佳方法是什么?

我不喜欢这样

val configurer = Configurer("init")
val withPropA = config.propA.map(configurer.propA).getOrElse(configure)
val withPropB = config.propB.map(configurer.propB).getOrElse(withPropA)
val withPropC = config.propC.map(configurer.propC).getOrElse(withPropB)


只是觉得应该有一种优雅的方式。

最佳答案

您可以使用var做到这一点,通常这是scala中代码不良的标志,但在这种情况下,我认为这是绝对可以接受的。

def buildConfigurer(propA: Option[String], propB: Option[Int], propC: Option[String]) = {
   var configurer = new Configurer("init")
   propA.foreach(a => configurer = configurer.propA(a))
   propB.foreach(b => configurer = configurer.propB(b))
   propC.foreach(c => configurer = configurer.propC(c))
   configurer
}

10-08 20:14