我已经在Scala编程了几个月了。我仍然对许多不同的收藏品感到困惑。
是否有某个页面/文章显示每种类型最适合的内容?
Scala的问题在于它有太多不同的类型,然后你有类似于Array的东西,它直接映射到Java数组,然后你有类似" Set"这实际上是一个"特质"但是你可以像普通类一样使用它,即使我的理解是特性就像一个接口。文档说"要实现具体集,您需要定义以下方法:..."但实际上我可以使用它。
整件事让我很困惑。来自C#/ .NET,事情很清楚,我没有像#34; LinkedHashMap"这样的奇怪类型。和" LinkedHashSet"。
答案 0 :(得分:2)
使用trait(接口)Seq(有序列表),Map(键值),Set,IndexedSeq,Array(用于Java原语)类型,让编译器选择实现。如果查看源代码,您将看到每个源的伴随对象。这使用工厂为您找到实现。
这页帮助了我。 http://docs.scala-lang.org/overviews/collections/overview.html
有关具体集合的部分将进入实现。
Seq伴侣对象:
object Seq extends SeqFactory[Seq] {
/** $genericCanBuildFromInfo */
implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, Seq[A]] = ReusableCBF.asInstanceOf[GenericCanBuildFrom[A]]
def newBuilder[A]: Builder[A, Seq[A]] = immutable.Seq.newBuilder[A]
}
https://github.com/scala/scala/blob/v2.10.3/src/library/scala/collection/Seq.scala#L1
查看工厂源代码,了解apply如何初始化集合。
abstract class GenericCompanion[+CC[X] <: GenTraversable[X]] {
/** The underlying collection type with unknown element type */
type Coll = CC[_]
/** The default builder for `$Coll` objects.
* @tparam A the type of the ${coll}'s elements
*/
def newBuilder[A]: Builder[A, CC[A]]
/** An empty collection of type `$Coll[A]`
* @tparam A the type of the ${coll}'s elements
*/
def empty[A]: CC[A] = newBuilder[A].result
/** Creates a $coll with the specified elements.
* @tparam A the type of the ${coll}'s elements
* @param elems the elements of the created $coll
* @return a new $coll with elements `elems`
*/
def apply[A](elems: A*): CC[A] = {
if (elems.isEmpty) empty[A]
else {
val b = newBuilder[A]
b ++= elems
b.result
}
}
}
更新: 我通常使用Array作为可变索引集合类型,因为它更容易键入,但Vector不可变。 Scala样式鼓励使用不可变集合,因为创建不可变数据结构的新“副本”是高性能的,因为底层实现是使用Hash数组映射的trie结构完成的。 http://en.wikipedia.org/wiki/Hash_array_mapped_trie
答案 1 :(得分:0)
我已经在Scala编程了几个月了。我还在 被许多不同的收藏所困惑。
你可能只需要一些时间来适应一些事情。 Scala不会是Scala,如果它看起来完全像另一种语言,对吧? :)每种编程语言都有其优点和缺点。
是否有某个页面/文章显示每种类型最佳的内容 适合?
您实际上需要一篇关于数据结构的一般文章。例如。如果您需要将数据存储在集合中,并且需要快速访问它们而不需要修改集合,那么数组是合适的。数组,列表,集合,映射等是在每种语言中基本上表现相同的数据结构。差异在于语法。
Scala的问题在于它有太多不同的类型 你有像Array一样直接映射到Java数组, 然后你会有类似的东西#34; Set&#34;这实际上是一个&#34;特质&#34;但是你 即使我的理解是a,也可以像普通课一样使用它 特质就像一个界面。文档说&#34;实现一个 具体集,您需要定义以下方法:...&#34;但 实际上我可以使用它。
您应该查看@sam已发布的链接:http://docs.scala-lang.org/overviews/collections/overview.html以下是另一个:http://twitter.github.io/scala_school/collections.html