隐式别名和扩展scala Seq
我有以下资料:隐式别名和扩展scala Seq,scala,implicit-conversion,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 } 我想将Seq[MyFoo]的对象转换为MyFoos,最好是隐式转换。如何做到这一点 例如 你可以这样做: case
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
,最好是隐式转换。如何做到这一点
例如
你可以这样做:
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
你的意思是说特征条;trait MyFoo{def bars:Seq[Bar]}?我更新了描述我更新了描述,尽管我不确定它是否会改变你的答案。隐式方法是否必须创建一个代理所有Seq方法的具体对象?这也是无法推断的?因为您要在Foos中扩展Seq,所以需要。您可以选择不在Foos中扩展Seq[Foo],在需要进行隐式转换时,您将获得默认的Seq实现和bars方法。由于我仍然希望最终类型具有Seq[Foo]特性,我想我仍然需要在所有3种情况下实现这些方法。没关系,尽管我希望有一种方法可以做一些类似类型别名(type Foos=Seq[Foo])的事情,但也可以在中添加一个方法。不过,这个答案很好,谢谢!
implicit class GetAllBars(myFoo:Seq[MyFoo]) {
def bars : Seq[Bar] = myFoo.map(_.bars).flatten
}
val foos = Seq(new MyFoo(Seq(new Bar)))
foos.bars