Chr*_*man 4 scala implicit-conversion
我有以下内容:
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
}
Run Code Online (Sandbox Code Playgroud)
我想将对象转换Seq[MyFoo]为MyFoos,最好隐式.怎么能实现这个目标?
例如.
val foos : Foos = Seq(new MyFoo(Seq(new Bar)))
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
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
Run Code Online (Sandbox Code Playgroud)
UPDATE
这可能是您正在寻找的更多内容:
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
Run Code Online (Sandbox Code Playgroud)
更新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
Run Code Online (Sandbox Code Playgroud)