huitseeker и Kipton, вероятно, найдут прямой ответ, который вы ищете.
С учетом вышесказанного, единственный вариант использования, который я могу себе представить, - это если вы хотите объединить вызовы для одного и того же объекта и убедиться, что вы действительно работаете над одним и тем же объектом. Есть ли другие?
Например:
class Counter {
var i = 0
override def toString = i.toString
}
def incr(c: Counter): Counter = { c.i += 1; c }
val two = incr(incr((new Counter)))
// two: Counter = 2
Если я позвоню incr
два раза подряд, я ожидаю получить два. Теперь давайте представим, что я работаю с недобросовестной функцией, такой как:
def incorrect_incr(c: Counter): Counter = {
c.i += 1
new Counter // should return c but does not
}
val notTwo = incorrect_incr(incorrect_incr(new Counter))
// notTwo: Counter = 0
Я думаю, что использование обертки для гарантии того, что мы продолжаем работать над одним и тем же объектом, решит эту проблему (отредактировано после размышлений о том, как сделать это более идиоматичным):
case class Id[T <: AnyRef](t:T) {
def map[U](f: (T) => U): Id[T] = {
f(t)
this
}
def get: T = t
}
val reallyTwo = Id(new Counter).map(incorrect_incr).map(incorrect_incr).get
// reallyTwo: Counter = 2
map
в основном обеспечивает вызов функции для побочного эффекта, get
разворачивает значение ...