如何使用一些额外的方法扩展类的实例(例如List [Int])?

时间:2012-12-13 14:46:03

标签: scala

  

可能重复:
  scala: adding a method to List?

我很难制定我正在尝试做的事情,但代码示例应该非常简单。如果有人知道更好的方式来表达它,你可以自由编辑标题。 :)

trait DiceThrow {
  list: List[Int] =>   // something like this??
  def yatzee = list.filter(_ == list.head).length >= 5
}

object Main extends App {
  val aThrow = List(4,4,4,4,4) with DiceThrow
  aThrow.yatzee  // => true    is what I want
}

所以我希望aThrow: List[Int]有一些额外的方法,比如知道它是否是yatzee。这只是我编写的一个例子,其中添加了一些额外的方法,例如List可能有用。

这有可能吗?或者是否有另一种方法更多 scala方式?我相信它可以用隐式转换(?)(它们对我来说仍然非常“神奇”),但这个用例似乎不必要地变脏了?

1 个答案:

答案 0 :(得分:2)

您可以使用充实(pimp)我的库模式:

class DiceList(list: List[Int]) {
  def yatzee = list.filter(_ == list.head).length >= 5
}

implicit def list2DiceList(list: List[Int]) = new DiceList(list)

在scala 2.10中,可以使用implicit classes进行简化:

implicit class DiceList(list: List[Int]) {
  def yatzee = list.filter(_ == list.head).length >= 5
}

然后你就可以使用它:

object Main extends App {
  val aThrow = List(4,4,4,4,4)
  aThrow.yatzee  // => true
}