我來自Groovy,它對每個接受單參數閉包的類型都有一個.with
方法;參數是調用.with
方法的對象。這允許擴展功能鏈功能的非常酷的技術,它釋放你引入臨時變量的責任,考慮代碼的因素,使其更易於閱讀和執行其他細節。.with Scala中的替代方法
我希望能夠做這樣的事情:
Seq(1, 2, 3, 4, 5)
.filter(_ % 2 == 0)
.with(it => if (!it.isEmpty) println(it))
代替
val yetAnotherMeaninglessNameForTemporaryVariable =
Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
if (!yetAnotherMeaninglessNameForTemporaryVariable.isEmpty)
println(yetAnotherMeaninglessNameForTemporaryVariable)
在第一個例子換句話說,.with
是有點兒類似於.foreach
但不是迭代通它在對象本身上被調用一次的對象的項目。所以it
等於Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
。
因爲我很驚訝沒有發現這樣的事情在Scala中,我的問題是:
- 我這麼想嗎?
- 有沒有其他Scala原生的技術?
- 如果沒有,是否有任何體面的原因,爲什麼這個功能沒有在Scala中實現?
更新: 一個相應的功能要求已經被張貼在斯卡拉問題跟蹤:https://issues.scala-lang.org/browse/SI-5324。請投票贊成
只需要注意一點:`with`是Scala中的一個保留字,因此該方法無法命名爲相同的東西。它仍然應該以其他名字存在;這是StackOverflow上最常見的Scala問題和答案,據我所知(「它不存在;讓你自己像這樣」)! – 2011-12-16 18:59:09
我認爲`convert`這個名字最適合,因此表明這種方法應該沒有副作用,並且因爲它將調用者作爲參數並返回新的東西,它必須是某種轉換。從這個意義上說,這個功能在標準庫中是不可替代的。同樣如http://stackoverflow.com/a/8538277/485115中建議的那樣,還應該有一個名爲「tap」的副作用變體,它返回調用者對象。 – 2011-12-16 23:15:15