使用元组作为值类的单个参数是否有缺点?

时间:2013-03-13 23:17:12

标签: scala

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
}

使用这种方法我仍然可以获得值类的内存分配好处吗?

1 个答案:

答案 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类的隐式转换和对扩展方法的调用是相同的,因此在两种情况下都将应用相同的类型类。