【问题标题】:Enumerations -> Sealed trait with a "Value"?枚举->具有“值”的密封特征?
【发布时间】:2012-11-21 07:31:21
【问题描述】:

这个问题与第一个问题有关: Iteration over a sealed trait in Scala?

我有以下密封特征

/**
 * @author Sebastien Lorber (<i>lorber.sebastien@gmail.com</i>)
 * Date: 02/12/12 - Time: 17:49
 */
sealed trait ResizedImageKey {

  /**
   * Get the dimensions to use on the resized image associated with this key
   */
  def getDimension(originalDimension: Dimension): Dimension

}

object ResizedImageKey {
  val ALL_KEYS: List[ResizedImageKey] = List(Large,Medium,Small,X2)
}

case class Dimension(width: Int,  height: Int)

case object Large extends ResizedImageKey {
  def getDimension(originalDimension: Dimension) = Dimension(1000,1000)
}

case object Medium extends ResizedImageKey{
  def getDimension(originalDimension: Dimension) = Dimension(500,500)
}

case object Small extends ResizedImageKey{
  def getDimension(originalDimension: Dimension) = Dimension(100,100)
}

case object X2 extends ResizedImageKey{
  def getDimension(originalDimension: Dimension) = Dimension(
    width = originalDimension.width * 2,
    height = originalDimension.height * 2
  )
}

现在这工作正常。 问题是我需要能够使用我的 ResizedImageKey 作为映射的键,该映射将使用 Salat 存储在 MongoDB 中。

我不认为 Salat 支持“密封特征转换”,对吧? 那么我应该转向枚举,这迫使我为尺寸计算进行匹配/案例吗?或者这个问题有什么已知的解决方案吗? 是否可以在不扩展 Enumeration 或其他东西的情况下创建枚举 Value 对象?

谢谢

【问题讨论】:

  • 您确实会收到“匹配并非详尽无遗...”的警告,因为该特征是密封的。

标签: scala salat


【解决方案1】:

Salat 开发人员在这里。

Salat 支持使用 @Salat 注释的案例对象层次结构。 (我从不建议在 Scala 中使用枚举——它们太可怕了。)

现在...使用 case 对象作为 map 的键实际上不是 mongo 支持的。 mongo 中的所有映射键都需要是字符串。

那么你试图坚持的这张地图是什么样子的?

【讨论】:

  • 谢谢。它看起来像 [ImageResizeKey,FileDescriptor],如果可能的话,我宁愿保持这种状态而不是 [String,FileDescriptor]。
  • 不幸的是,由于 MongoDB 不支持使用对象作为映射的键,您可以做的是持久化案例类列表并将其转换为映射作为案例类中的惰性 val .要求映射的键是字符串是 MongoDB 的明确限制。
猜你喜欢
  • 2015-09-17
  • 1970-01-01
  • 2022-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
相关资源
最近更新 更多