【问题标题】:Scala generic that implements method toIterator实现方法 toIterator 的 Scala 泛型
【发布时间】:2016-08-14 20:00:21
【问题描述】:

我需要一个函数,它可以接收一个数组、一个映射、一个列表[几乎任何带有toIterator 方法的容器],对其进行迭代,然后打印它的元素。

我试过了:

def method[CollectionT <: TraversableLike[Any, Any]](collection: CollectionT, numElements: Int) {
  val iterator = collection.toIterator
  for(i <- 0 until numElements) {
    if(iterator.hasNext) {
      println(iterator.next()) 
    }
  }
}

^ 但它不适用于 Array[T]

如何在 Scala 中创建一个遗传函数,该函数将接收具有“toIterator: Iterator[A]”方法的类的任何实例?

【问题讨论】:

    标签: scala generics collections iterator


    【解决方案1】:

    您可以在这里使用的通用类型是GenTraversable

    scala> def printAll(coll: collection.GenTraversable[_]) = coll.foreach(println)
    defined function printAll
    scala> printAll("aaa")
    a
    a
    a
    
    scala> printAll(Array(1,2,3))
    1
    2
    3
    
    scala> printAll(Seq(4,5,6))
    4
    5
    6
    

    您也不需要迭代器。您可以更轻松地调用foreach 或使用for 理解。

    【讨论】:

    • 我建议使用GenTraversableOnce(或TraversableOnce,如果你想禁止并行收集)。
    • @PaulDraper - GenTraversableOnce 是 GenTraversable 的超类。您的意思是“如果您想允许并行收集,我建议使用 GenTraversableOnce?”
    • @MichaelLafayette 我认为 Paul 的意思是“GenTraversableOnce 而不是 GenTraversable”。
    • @Jean-PhilippePellet 是的,但如果您想允许使用并行集合,您可以使用 GenTraversableOnce。保罗说“......如果你想禁止并行集合,请使用GenTraversableOnce”。但是,是的,在我的打印定位器库 (github.com/JohnReedLOL/scala-trace-debug) 中,我使用的是 GenTraversableOnce。谢谢你。 p.s.如果您是 IDE 用户,请尝试我的库。
    • @MichaelLafayette Paul 写的和你写的相反。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多