4

私は次のものを持っています:

case class Bar()

trait Foo {
  def bars : Seq[Bar]
}
case class MyFoo(bars : Seq[Bar]) extends Foo

trait Foos extends Seq[Foo] {
  def bars : Seq[Bar] = this.map(_.bars).flatten
}

Seq[MyFoo]のオブジェクトをMyFoos、できれば暗黙的に に変換したいと思います。どうすればこれを達成できますか?

例えば。

val foos : Foos = Seq(new MyFoo(Seq(new Bar)))
4

1 に答える 1

5

次のようなことができます。

  case class Bar()

  trait Foo {
    def bars : Seq[Bar]
  }
  case class MyFoo(bars : Seq[Bar]) extends Foo

  trait Foos extends Seq[Foo] {
    def bars : Seq[Bar] = this.map(_.bars).flatten
  }

  implicit def seqMyFooToMyFoos(myFoos:Seq[Foo]) = new Foos {
    def length: Int = myFoos.length

    def apply(idx: Int): Foo = myFoos(idx)

    def iterator: Iterator[Foo] = myFoos.iterator
  }

  val foos : Foos = Seq(new MyFoo(Seq(new Bar))) // Uses implicit conversion

アップデート

これはあなたが探しているものよりも多いかもしれません:

  trait Foos {
    def bars : Seq[Bar]
  }

  implicit def seqMyFooToMyFoos(myFoo:Seq[MyFoo]) = new Foos {
    def bars : Seq[Bar] = myFoo.map(_.bars).flatten
  }

  val foos = Seq(new MyFoo(Seq(new Bar)))

  foos.bars

更新 2

scala 2.10 を使用している場合は、暗黙のクラスを使用して Foos トレイトを削除できます。

  implicit class GetAllBars(myFoo:Seq[MyFoo]) {
    def bars : Seq[Bar] = myFoo.map(_.bars).flatten
  }

  val foos = Seq(new MyFoo(Seq(new Bar)))

  foos.bars
于 2013-03-30T03:00:20.137 に答える