处理副作用:链式构造函数和设置方法的辅助函数

时间:2017-10-18 09:54:44

标签: scala functional-programming method-chaining side-effects

当使用现有的库(不能编辑构造函数或伴随对象)时,我经常发现我需要在对象上调用init / setup过程然后返回对象本身。我通常最终会做类似以下的事情。

def createObject: MyObject = {
    val o = new MyObject
    o.init()
    o
}

这是恕我直言 非常优雅,我想知道是否有更好的方法,例如 setup-and-get 功能如下:

def createObject: MyObject = {
    setupAndGet(new MyObject) { _.init(v) }
}

在Scala中是否有任何现有的解决方案(除了自己编写)?

3 个答案:

答案 0 :(得分:2)

好吧,每个Scala案例类都附带一个生成的伴随对象,该对象具有apply方法,该方法具有此确切签名。

scala> case class Foo(s:String)
defined class Foo

scala> Foo.apply("hello")
res1: Foo = Foo(hello)

请注意,.apply()方法是默认方法调用,您只需编写Foo("hello")

答案 1 :(得分:1)

以下可能是您想要的。

def applyAndGet(myObject: MyObject)(f: myObject.type => Unit): myObject.type = {
  f(myObject)
  myObject
}

但我建议调用像new MyObject(value)这样的构造函数。

答案 2 :(得分:1)

考虑以下扩展方法(有很多关于它们的信息,如果您不知道它们是什么,只需谷歌):

implicit class SetupExtension[T](private val t: T) extends AnyVal {
  def setup(code: T => Any): T = {
   code(t)
   t
  }
}
val s: MyObject = new MyObject.setup(_.setXProperty(???))

当你使用一些可变的api(来自java库等)时,这个方法非常有用。除此之外,我不建议这样做。