Другим предложением будет использование оператора forward pipe из Scalaz .
val person = Person.create |> { p =>
p.firstName = "Collin"
p.lastName = "VanDyck"
p // or p.saveMe
}
Разница в том, что вам придется возвращать значение самостоятельно, если вы хотите присвоить его. Если вам не нужно возвращаемое значение (как в первоначальном примере), все будет проще:
Person.create |> { p =>
p.firstName = "Collin"
p.lastName = "VanDyck"
p.save
}
И вот, пожалуйста.
Я неохотно использовал его в своем собственном коде (хотя я и одобряю этот способ - но он документирован только в скалазе, и, возможно, его трудно будет понять другим, кто просматривает код), Я надеюсь, что эти примеры работают.
Конечно, вы можете определить свой собственный «прямой и обратный канал», используя |>
.
class ReturningPipe[A](value: A) {
import Scalaz._
def |>>[B](f: A => B):A = value.|>(a => { f(a); value})
}
implicit def returningPipe[A](value: A) = new ReturningPipe(value)