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

Scala Numeric init,常量为0

发布时间:2020-12-16 18:54:48 所属栏目:安全 来源:网络整理
导读:让我有一个名为MathUtil的实用程序类. 它看起来像这样. abstract class MathUtil(T:Numeric){ def nextNumber(value:T) def result():T} 让我以这种方式对它进行子类化 class SumUtil[T:Numeric] extends MathUtil[T]{ private var sum:T = 0 override def n
让我有一个名为MathUtil的实用程序类.

它看起来像这样.

abstract class MathUtil(T:Numeric){
   def nextNumber(value:T)
   def result():T
}

让我以这种方式对它进行子类化

class SumUtil[T:Numeric] extends MathUtil[T]{
   private var sum:T = 0
   override def nextNumber(value:T){
     sum = sum + value
   }
   override def result():T = sum
}

我的陈述有问题

private var sum:T = 0

现在,我必须初始化为总和0.我猜任何数字都有办法表示0.我对scala很新.我该如何解决这个问题?

解决方法

Numeric type class instance有一个零方法,可以做你想要的:

class SumUtil[T: Numeric] extends MathUtil[T] {
   private var sum: T = implicitly[Numeric[T]].zero
   override def nextNumber(value: T) {
     sum = implicitly[Numeric[T]].plus(sum,value)
   }
   override def result(): T = sum
}

请注意,除非导入Numeric.Implicits._,否则还需要plus方法的实例,在这种情况下可以使用.在这种情况下,您也可以通过不使用上下文绑定语法来清理代码:

class SumUtil[T](implicit ev: Numeric[T]) extends MathUtil[T] {
   import Numeric.Implicits._
   private var sum: T = ev.zero
   override def nextNumber(value: T) {
     sum = sum + value
   }
   override def result(): T = sum
}

这完全等价:上下文绑定版本只是这个隐式参数的语法糖,但是如果你需要明确地使用那个参数(正如你在这里做的那样,为零),我发现编写desugared版本更清晰.

(编辑:李大同)

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

    推荐文章
      热点阅读