私はGroovyから来て、単一引数のクロージャを受け入れるすべての型に対して.with
メソッドを持っています。引数は、.with
メソッドが呼び出されているオブジェクトです。これにより、関数型連鎖機能を拡張する非常にクールな手法が可能になります。これにより、一時変数の導入義務を解消し、コードを考慮して読みやすくなり、その他の細かいことが可能になります。 .with
が.foreach
にちょっと似ていますが、代わりにスルー反復の代わりに、最初の例では、言い換えれば.with alternative in scala
val yetAnotherMeaninglessNameForTemporaryVariable =
Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
if (!yetAnotherMeaninglessNameForTemporaryVariable.isEmpty)
println(yetAnotherMeaninglessNameForTemporaryVariable)
の
Seq(1, 2, 3, 4, 5)
.filter(_ % 2 == 0)
.with(it => if (!it.isEmpty) println(it))
:
私はこのような何かを行うことができるようにしたいですそれはオブジェクト自体の上で一度呼び出されているオブジェクトの項目です。従ってit
はSeq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
に等しい。
私はScalaではそのようなものを見つけることではない非常に驚いたので、私の質問は以下のとおりです。
- 私は何かが足りないのですか?
- Scala固有の代替テクニックはありますか?
- もしそうでなければ、この機能がScalaに実装されていない理由はありますか?
更新:https://issues.scala-lang.org/browse/SI-5324: 適切な機能要求は、Scalaの課題追跡に掲載されています。投票して宣伝してください
ちょうどメモ: 'with'はScalaの予約語なので、メソッドを同じ名前にすることはできません。それはまだ他の名前の下に存在するはずです。これはStackOverflow上で最も一般的なScalaの質問と回答です(私はそれが存在しない、あなたのようにこのようにしています)。 –
私は 'convert'という名前が最適だと思うので、このメソッドは副作用がなく、呼び出し元をパラメータとして受け取り、新しい何かを返すので、ある種の変換でなければならないことを示唆しています。その意味で、この関数は標準ライブラリでは置き換えられません。また、http://stackoverflow.com/a/8538277/485115で提案されているように、呼び出し元オブジェクトを返す 'tap'という名前の副作用バリアントも存在するはずです。 –