Условный вызов метода в Scala

Я нашел этот паттерн довольно много раз в своем коде:

  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)

Есть ли у кого-нибудь идея получше? Неужели мне не хватает магии Скалаза?

12
задан Eric 5 September 2011 в 23:36
поделиться