加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读