在Scala中有条件地调用一个方法
发布时间:2020-12-16 19:10:22 所属栏目:安全 来源:网络整理
导读:我的代码中已经发现了这样一个模式: if (doIt) object.callAMethod else object 我想知道如果在上面编写代码可能会有更加令人愉快的语法,特别是为了避免重复对象变量.就像是: // using the Scalaz "pipe" operator // and "pimping" f: T = T with a `when
我的代码中已经发现了这样一个模式:
if (doIt) object.callAMethod else 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) 不是很好,因为我必须声明一个隐含的值,但是如果有几个链接的电话,这样做是有益的: object ?> (_.callAMethod) ?> (_.callAnotherMethod) 有没有人有更好的主意?我在这里错过了一些Scalaz魔法吗 解决方法class When[A](a: A) { def when(f: A => Boolean)(g: A => A) = if (f(a)) g(a) else a } implicit def whenever[A](a: A) = new When(a) 例: scala> "fish".when(_.length<5)(_.toUpperCase) res2: java.lang.String = FISH (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |