gpt4 book ai didi

Scala Numeric init 常量为 0

转载 作者:行者123 更新时间:2023-12-04 13:53:01 24 4
gpt4 key购买 nike

让我有一个名为 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有一个 zero做你想要的方法:

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
}

请注意,您还需要 plus 的实例方法,除非你导入 Numeric.Implicits._ ,在这种情况下,您可以使用 + .在这种情况下,您还可以通过不使用上下文绑定(bind)语法来稍微清理一下代码:
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
}

这是完全等价的:上下文绑定(bind)版本只是这个隐式参数的语法糖,但是如果您需要显式使用该参数(就像您在此处所做的那样,为其 zero ),我发现编写脱糖版本更简洁。

关于Scala Numeric init 常量为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11163190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com