当使用现有的库(不能编辑构造函数或伴随对象)时,我经常发现我需要在对象上调用init / setup过程然后返回对象本身。我通常最终会做类似以下的事情。
def createObject: MyObject = {
val o = new MyObject
o.init()
o
}
这是恕我直言 非常优雅,我想知道是否有更好的方法,例如, setup-and-get 功能如下:
def createObject: MyObject = {
setupAndGet(new MyObject) { _.init(v) }
}
在Scala中是否有任何现有的解决方案(除了自己编写)?
答案 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库等)时,这个方法非常有用。除此之外,我不建议这样做。