事例对象枚举、顺序和隐含项



出于教学目的,我使用enumeration和case对象实现了枚举。我对Enumeration版本很满意,尽管它不能在match语句中警告丢失的事例。

我曾尝试编写等效的用例对象,但我发现,尽管它可以编译,但它不会运行。特别是,它在运行时似乎进入了一个无限循环(然而,我还没能在调试器中确认这一点)。这是我试图运行的代码:

sealed abstract class Suit extends Ordered[Suit] {
  val name: String
  val priority: Int
  override def toString = name
  def compare(that: Suit) = priority-that.priority
}
case object Spades extends Suit { val name = "Spades"; val priority = 0 }
case object Hearts extends Suit { val name = "Hearts"; val priority = 1 }
case object Diamonds extends Suit { val name = "Diamonds"; val priority = 2 }
case object Clubs extends Suit { val name = "Clubs"; val priority = 3 }
object Suit {
  implicit def ordering[A <: Suit]: Ordering[A] = Suit.ordering
  def suits = List(Clubs,Spades).sorted
}

如果我将这段代码输入REPL(通过粘贴模式),或者在Eclipse中编译它,一切都会很好。但是,如果我试图测试Suit对象的suits方法,运行就会挂起,我必须终止它

我已经尝试了我在StackOverflow上找到的关于隐词的大多数(如果不是全部的话)建议(例如,没有定义Suit类来扩展Ordered[Suit],而是直接为该类指定Ordering。然而,这些都没有编译。

非常感谢工作建议。

object Suit {
  implicit def ordering[A <: Suit]: Ordering[A] = Suit.ordering
}

这是一个无限循环,ordering调用自己。我认为您想要一个Ordering[Suit],在这种情况下,要求对Suit的子类型A进行排序是没有意义的(这将是一个单独的case对象)。

扩展Ordered的类型已经有了隐式排序,所以您甚至不需要构造一个:

implicitly[Ordering[Suit]]  // aka Ordering.ordered[Suit]

因此,以下方法有效:

object Suit {
  def suits = List[Suit](Clubs, Spades).sorted
}

请注意,List(Clubs, Spades).sorted不起作用,因为推断出的列表元素类型是Suit with Product,这会导致无法找到明确的排序。

我之前遇到的部分问题是,Suit实际上扩展了一个名为Concept的特性,我在这里没有展示它(为了简化事情)。

然而,它实际上允许对0_的答案进行轻微改进,因为我不再需要显式地设置列表的类型。以下是代码,至少是相关部分:

trait Concept extends Ordered[Concept]{
  val name: String
  val priority: Int
  override def toString = name
  def compare(that: Concept) = priority-that.priority
}
sealed trait Suit extends Concept {
}
object Concept {
  implicit def ordering[A <: Concept]: Ordering[A] = Ordering.by(_.priority)
}
case object Spades extends Suit { val name = "Spades"; val priority = 0 }
case object Hearts extends Suit { val name = "Hearts"; val priority = 1 }
case object Diamonds extends Suit { val name = "Diamonds"; val priority = 2 }
case object Clubs extends Suit { val name = "Clubs"; val priority = 3 }
object Suit {
  import scala.math.Ordered.orderingToOrdered
  def suits = List(Clubs,Spades).sorted
}

相关内容

  • 没有找到相关文章

最新更新