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庫等)。除此之外,我不會推薦這樣做。