Scala中生成Range和NumericRange的区别是什么

x33g5p2x  于 2022-12-13  发布在  Scala
关注(0)|答案(1)|浏览(162)

我是Scala的新手,我尝试生成一些Range对象。

val a = 0 to 10
// val a: scala.collection.immutable.Range.Inclusive = Range 0 to 10

此语句运行良好,生成的范围从0到10。并且to关键字无需任何导入即可运行。
但是当我试图用浮点数生成NumericRange时,我必须从BigDecimal对象导入一些函数,如下所示,以使用to关键字。

import scala.math.BigDecimal.double2bigDecimal
val f = 0.1 to 10.1 by 0.5
// val f: scala.collection.immutable.NumericRange.Inclusive[scala.math.BigDecimal] = NumericRange 0.1 to 10.1 by 0.5

有没有人能解释一下这其中的原因和射程生成背后的机制。谢谢。

p4tfgftt

p4tfgftt1#

您添加的导入添加了从DoubleBigDecimal的“自动转换”,正如其名称所示。
这是必要的,因为NumericRange只适用于T类型,Integral[T]存在于T类型中,不幸的是,Integral[T]不存在于Double类型中,但存在于BigDecimal类型中。
将自动转换纳入范围会在BigDecimal中转换Double,以便可以套用/定义NumericRange
通过直接将数字声明为BigDecimal s,可以在不导入的情况下获得相同的范围:

BigDecimal("0.1") to BigDecimal("10.1") by BigDecimal("0.5")

相关问题