我在我的代码中发现了这个模式很多次:
...
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)
有没有更好的想法?我是否错过了一些Scalaz魔法呢?