gpt4 book ai didi

scala - 使用元组作为值类的单个参数有什么缺点吗?

转载 作者:行者123 更新时间:2023-12-02 02:05:13 27 4
gpt4 key购买 nike

Scala 2.10 添加了对 value classes 的支持.值类的局限性之一是它“必须只有一个主构造函数和一个类型不是值类的公共(public) val 参数。”

对单个 val 参数使用元组有什么缺点吗?

例如,我想创建一个值类型来表示具有开始和结束的时间段。因为我不能有两个参数,所以我可以将该范围表示为 (Long, Long)

case class Period(timeRange: (Long, Long)) extends AnyVal {
def start: Long = timeRange._1
def end: Long = timeRange._2
def contains(time: Long): Boolean = time >= start && time < end
}

使用这种方法我还能获得值类的内存分配优势吗?

最佳答案

缺点是,正如您所说,您将创建一个额外的 Tuple2 对象来存储两个 Long。然而,不会有装箱 -- Tuple2 专门用于 Long。所以 - 在这种情况下,您最好创建一个案例类。

以下内容与您的问题没有直接关系,但可能有用。在某些情况下,如果您的值类是通用的,则您需要一个类型类。例如,假设您想为 Numeric 类型添加一个额外的阶乘方法 !。您必须执行以下操作:

implicit class IntegralOps[T: Numeric](val x: T) extends AnyVal {
def ! = ???
}

这行不通,因为类型类约束被翻译成一个额外的隐式参数,而值类只支持一个参数:

implicit class IntegralOps[T](val x: T)(implicit $evidence: Numeric[T]) extends AnyVal {
def ! = ???
}

在这种情况下,您可以使用的技巧是将类型类参数移动到所有扩展方法:

implicit class IntegralOps[T](val x: T) extends AnyVal {
def !(implicit $evidence: Numeric[T]) = ???
}

由于相同的调用点对于到 IntegralOps 类的隐式转换和对扩展方法的调用是相同的,所以相同的类型类将适用于这两种情况。

关于scala - 使用元组作为值类的单个参数有什么缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15398350/

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