4

オブジェクトを変数に割り当てることなく、コピーステートメントでコピーされているオブジェクトを参照する方法はありますか?

たとえば、私はこれを行うことができます:

case class Foo(s: String)
val f = Foo("a")
f.copy(s = f.s + "b")

しかし、私はこれをしたい:

case class Foo(s: String)
Foo("a").copy(s = this.s + "b")
4

2 に答える 2

7

直接ではありません。このようなことを処理するために、パイプ メソッドを定義することがあります (ケース クラスだけではありません)。2.10 では:

implicit class PipeEverything[A](val value: A) extends AnyVal {
  def |>[Z](f: A => Z) = f(value)
}

しかし、これは常にそれほど多くのスペースを節約するとは限りません:

Foo("a") |> (x => x.copy(s = x.s + "b"))
{ val x = Foo("a"); x.copy(s = x.s + "b") }

コード ブロックは事実上 Scala のどこにでも配置できるため、一時的な val を作成するだけでは通常は大したことではないことに注意してください。

于 2013-01-25T20:16:00.003 に答える
3

Not an answer to your question, but an aside.

You might want to look into lenses, which will allow you to do something like:

case class Foo(s: String)
sLens.mod(Foo("a"), _ + "b")

You can define sLens yourself or have it auto-generated using a compiler plugin.

于 2013-01-25T20:24:50.790 に答える