2017-10-18 102 views
0

当处理现有库(不能编辑构造函数或伴随对象)时,我经常发现需要调用对象的init/setup过程,然后返回对象本身。我通常最终会做类似下面的事情。处理副作用:帮助函数链构造函数和设置方法

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

这是恕我直言不是非常优雅,我想知道是否有这样做,例如更好的方法,一个的建立和取得功能的线沿线的:

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

是否有斯卡拉这个任何现有的解决方案(除了写我自己的)?

+1

这不是“功能风格”。 'o.store'行为有副作用,所以你不可能在Scala中找到你想要的内容。 –

回答

2

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

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

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

注意,.apply()方法是默认的方法调用,您可以简单的写Foo("hello")

1

以下可能是你想要的。

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

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

+0

这会工作,但我正在寻找一种可能的“内置”方式,而无需编写自定义功能。 – Snps

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库等)。除此之外,我不会推荐这样做。