我是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
有没有人能解释一下这其中的原因和射程生成背后的机制。谢谢。
1条答案
按热度按时间p4tfgftt1#
您添加的导入添加了从
Double
到BigDecimal
的“自动转换”,正如其名称所示。这是必要的,因为
NumericRange
只适用于T
类型,Integral[T]
存在于T
类型中,不幸的是,Integral[T]
不存在于Double
类型中,但存在于BigDecimal
类型中。将自动转换纳入范围会在
BigDecimal
中转换Double
,以便可以套用/定义NumericRange
。通过直接将数字声明为
BigDecimal
s,可以在不导入的情况下获得相同的范围: