Я нашел этот паттерн довольно много раз в своем коде:
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)
Не очень удачный, так как я должен объявить неявное val
, но это окупится, если будет несколько цепочечных вызовов:
object ?> (_.callAMethod) ?> (_.callAnotherMethod)
Есть ли у кого-нибудь идея получше? Неужели мне не хватает магии Скалаза?