在Scala中,可以引用复制语句中复制的对象

时间:2013-01-25 20:03:12

标签: scala

有没有办法在复制语句中引用要复制的对象而不必将对象分配给变量?

例如,我可以这样做:

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")

2 个答案:

答案 0 :(得分: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通常不是什么大问题。

答案 1 :(得分:3)

不是你问题的答案,而是旁白。

您可能需要查看lenses,这样您就可以执行以下操作:

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

您可以自己定义sLens或拥有auto-generated using a compiler plugin