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

Scala隐含伴随对象中的Numeric [T]

发布时间:2020-12-16 19:12:08 所属栏目:安全 来源:网络整理
导读:我有以下通用的Interval类(由用户soc为我制定): case class Interval[T](from: T,to: T)(implicit num: Numeric[T]) { import num.mkNumericOps // allows us to write from.toDouble and to.toDouble def mid: Double = (from.toDouble + to.toDouble) / 2
我有以下通用的Interval类(由用户soc为我制定):

case class Interval[T](from: T,to: T)(implicit num: Numeric[T]) {
  import num.mkNumericOps // allows us to write from.toDouble and to.toDouble
  def mid: Double = (from.toDouble + to.toDouble) / 2.0
}

典型用例:Interval [Double]或Interval [Int].为了添加二元联合和交集运算符,我在伴随对象中使用了类似的模式(隐式num:Numeric [T]):

object Interval {

  def union[T](interval1: Interval[T],interval2: Interval[T])(implicit num: Numeric[T]) = {
    import num.mkOrderingOps // allows interval1.from min
    Interval[T](interval1.from min interval2.from,interval1.to max interval2.to)
  }

  def intersect[T](interval1: Interval[T],interval2: Interval[T])(implicit num: Numeric[T]) = {
    import num.mkOrderingOps
    Interval[T](interval1.from max interval2.from,interval1.to min interval2.to)
  }

}

复制(隐式num:Numeric [T])并在两个方法中导入num.mkOrderingOps是一个丑陋的样板.在Interval对象本身的层次上,有一些方法可以做到这一次吗?

解决方法

就在这里.

首先进口.您可以在Interval的范围内导入Ordering.Implicits._.

object Interval {
   import Ordering.Implicits._

   def union[T](....)(implicit num: Numeric[T]) = {
     // do not import num.mkOrderingOps
     ...
   }
   ...
}

有了这些含义,当它找到一个排序操作时,它会在操作发生的范围内寻找隐式的Ordering(Numeric is a Ordering).在每个例程中,恰好有一个隐含的范围.如果您也需要算术运算,也可以导入Numeric.Implicits._

现在有了隐含的论点.语言中有一个快捷方式,称为上下文绑定:
你可以写def f [T:X](args)而不是def f [T](args)(隐式someName:X [T])

不同之处在于你没有带上下文绑定的隐式名称(你可以使用implictly [T]但是这几乎不会更短.幸运的是,你不再需要一个名字了,导入Ordering.Implicits._

所以

object Interval {
   import Ordering.Implicits._
   // also import Numeric.Implicits._ if you need +,-,*,/ ...
   def union[T: Numeric] ...
   def intersection[T: Numeric] ...
}

(编辑:李大同)

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

    推荐文章
      热点阅读