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
}
使用这种方法我仍然可以获得值类的内存分配好处吗?
答案 0 :(得分:2)
正如您所说,缺点是您将创建一个额外的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
类的隐式转换和对扩展方法的调用是相同的,因此在两种情况下都将应用相同的类型类。