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

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

您可能想查看lens,这将允许您执行以下操作:

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

您可以定义sLens自己或使用编译器插件自动生成它。

于 2013-01-25T20:24:50.790 回答