Я нашел этот шаблон довольно много раз в своем коде:
if (doIt)
object.callAMethod
else
object
Мне интересно, может ли быть синтаксически более приятный способ написания кода выше, особенно во избежание повторения переменной object
. Что-то вроде:
// using the Scalaz "pipe" operator
// and "pimping" f: T => T with a `when` method
object |> (_.callAMethod).when(doIt)
К сожалению, приведенная выше строка не работает, потому что вывод типа требует тип параметра для (_.callAMethod)
.
Мой лучший подход на данный момент таков:
implicit def doItOptionally[T](t: =>T) = new DoItOptionally(t)
class DoItOptionally[T](t: =>T) {
def ?>(f: T => T)(implicit doIt: Boolean = true) =
if (doIt) f(t) else t
}
implicit val doIt = true
object ?> (_.callAMethod)
Не здорово, потому что я должен объявить implicit val
, но это окупается, если есть несколько связанных вызовов:
object ?> (_.callAMethod) ?> (_.callAnotherMethod)
У кого-нибудь есть идея получше? Я скучаю по магии Скалаза?