Scala 2.8 集合设计教程 [英] Scala 2.8 collections design tutorial

查看:33
本文介绍了Scala 2.8 集合设计教程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我令人窒息的困惑之后,有哪些很好的资源可以解释新的Scala 2.8 集合库已经构建.我有兴趣找到一些有关以下内容如何组合在一起的信息:

Following on from my breathless confusion, what are some good resources which explain how the new Scala 2.8 collections library has been structured. I'm interested to find some information on how the following fit together:

  • 集合类/特征本身(例如ListIterable)
  • 为什么存在 Like 类(例如 TraversableLike)
  • 伴随方法的用途(例如List.companion)
  • 我如何知道在给定点的范围内有哪些隐式对象
  • The collection classes/traits themselves (e.g. List, Iterable)
  • Why the Like classes exist (e.g. TraversableLike)
  • What the companion methods are for (e.g. List.companion)
  • How I know what implicit objects are in scope at a given point

推荐答案

前言

Martin Odersky 有一个 2.8 系列演练可能是你的第一个参考.它还补充了架构注释,这对那些想要设计自己的系列的人来说尤其重要.

Foreword

There's a 2.8 collection walk-through by Martin Odersky which should probably be your first reference. It has been supplemented as well with architectural notes, which will be of particular interest to those who want to design their own collections.

这个答案的其余部分是在任何此类东西存在之前编写的(实际上,在 2.8.0 本身发布之前).

The rest of this answer was written way before any such thing existed (in fact, before 2.8.0 itself was released).

您可以在 Scala SID #3 中找到有关它的论文.对于那些对 Scala 2.7 和 2.8 之间的差异感兴趣的人来说,该领​​域的其他论文也应该很有趣.

You can find a paper about it as Scala SID #3. Other papers in that area should be interesting as well to people interested in the differences between Scala 2.7 and 2.8.

我将有选择地引用论文,并补充我的一些想法.还有一些图片,由 Matthias 在 decodified.com 上生成,原始 SVG 文件可以在 这里.

I'll quote from the paper, selectively, and complement with some thoughts of mine. There are also some images, generated by Matthias at decodified.com, and the original SVG files can be found here.

实际上,集合的特征分为三种层次结构:一种用于可变集合,一种用于不可变集合,另一种对集合不做任何假设.

There are actually three hierarchies of traits for the collections: one for mutable collections, one for immutable collections, and one which doesn't make any assumptions about the collections.

并行、串行和可能并行集合之间也有区别,这是在 Scala 2.9 中引入的.我将在下一节中讨论它们.本节中描述的层次结构专指非并行集合.

There's also a distinction between parallel, serial and maybe-parallel collections, which was introduced with Scala 2.9. I'll talk about them in the next section. The hierarchy described in this section refers exclusively to non-parallel collections.

下图显示了 Scala 2.8 引入的非特定层次结构:

The following image shows the non-specific hierarchy introduced with Scala 2.8:

显示的所有元素都是特征.在其他两个层次结构中,也有直接继承特征的类,以及通过隐式转换为包装类可以视为属于该层次结构的类.这些图表的图例可以在它们之后找到.

All elements shown are traits. In the other two hierarchies there are also classes directly inheriting the traits as well as classes which can be viewed as belonging in that hierarchy through implicit conversion to wrapper classes. The legend for these graphs can be found after them.

不可变层次结构图:

可变层次结构图:

图例:

以下是集合层次结构的缩写 ASCII 描述,供看不到图像的人使用.

Here's an abbreviated ASCII depiction of the collection hierarchy, for those who can't see the images.

                    Traversable
                         |
                         |
                      Iterable
                         |
      +------------------+--------------------+
     Map                Set                  Seq
      |                  |                    |
      |             +----+----+         +-----+------+
    Sorted Map  SortedSet   BitSet   Buffer Vector LinearSeq

并行集合

当 Scala 2.9 引入并行集合时,设计目标之一是尽可能无缝地使用它们.用最简单的术语来说,可以用并行集合替换非并行(串行)集合,并立即获得好处.

Parallel Collections

When Scala 2.9 introduced parallel collections, one of the design goals was to make their use as seamless as possible. In the simplest terms, one can replace a non-parallel (serial) collection with a parallel one, and instantly reap the benefits.

然而,由于在此之前的所有集合都是串行的,许多使用它们的算法假定并依赖于它们串行的事实.提供给具有此类假设的方法的并行集合将失败.因此,上一节中描述的所有层次结构要求串行处理.

However, since all collections until then were serial, many algorithms using them assumed and depended on the fact that they were serial. Parallel collections fed to the methods with such assumptions would fail. For this reason, all the hierarchy described in the previous section mandates serial processing.

创建了两个新的层次结构来支持并行集合.

Two new hierarchies were created to support the parallel collections.

并行集合层次结构具有相同的特征名称,但以 Par 开头:ParIterableParSeqParMapParSet.请注意,没有 ParTraversable,因为任何支持并行访问的集合都能够支持更强的 ParIterable 特性.它也没有序列层次结构中存在的一些更专业的特征.整个层次结构位于 scala.collection.parallel 目录下.

The parallel collections hierarchy has the same names for traits, but preceded with Par: ParIterable, ParSeq, ParMap and ParSet. Note that there is no ParTraversable, since any collection supporting parallel access is capable of supporting the stronger ParIterable trait. It doesn't have some of the more specialized traits present in the serial hierarchy either. This whole hierarchy is found under the directory scala.collection.parallel.

实现并行集合的类也不同,ParHashMapParHashSet 用于可变和不可变并行集合,另外还有 ParRangeParVector 实现了 immutable.ParSeqParArray 实现了 mutable.ParSeq.

The classes implementing parallel collections also differ, with ParHashMap and ParHashSet for both mutable and immutable parallel collections, plus ParRange and ParVector implementing immutable.ParSeq and ParArray implementing mutable.ParSeq.

还存在另一个层次结构,它反映了串行和并行集合的特征,但带有前缀 Gen:GenTraversableGenIterableGenSeqGenMapGenSet.这些特征是并行和串行集合的父项.这意味着采用 Seq 的方法无法接收并行集合,但采用 GenSeq 的方法预计可用于串行和并行集合.

Another hierarchy also exists that mirrors the traits of serial and parallel collections, but with a prefix Gen: GenTraversable, GenIterable, GenSeq, GenMap and GenSet. These traits are parents to both parallel and serial collections. This means that a method taking a Seq cannot receive a parallel collection, but a method taking a GenSeq is expected to work with both serial and parallel collections.

鉴于这些层次结构的结构方式,为 Scala 2.8 编写的代码与 Scala 2.9 完全兼容,并且需要串行行为.无需重写,无法利用并行集合,但所需更改非常小.

Given the way these hierarchies were structured, code written for Scala 2.8 was fully compatible with Scala 2.9, and demanded serial behavior. Without being rewritten, it cannot take advantage of parallel collections, but the changes required are very small.

通过调用方法par 可以将任何集合转换为并行集合.同样,任何集合都可以通过调用它的 seq 方法将其转换为串行.

Any collection can be converted into a parallel one by calling the method par on it. Likewise, any collection can be converted into a serial one by calling the method seq on it.

如果集合已经是请求的类型(并行或串行),则不会进行转换.但是,如果在并行集合上调用 seq 或在串行集合上调用 par,则会生成具有请求特征的新集合.

If the collection was already of the type requested (parallel or serial), no conversion will take place. If one calls seq on a parallel collection or par on a serial collection, however, a new collection with the requested characteristic will be generated.

不要将 seqtoSeq 混淆,后者将集合转换为非并行集合,toSeq 返回从集合的元素.对并行集合调用 toSeq 将返回 ParSeq,而不是串行集合.

Do not confuse seq, which turns a collection into a non-parallel collection, with toSeq, which returns a Seq created from the elements of the collection. Calling toSeq on a parallel collection will return a ParSeq, not a serial collection.

虽然有许多实现类和子特性,但层次结构中有一些基本特性,每个特性提供更​​多方法或更具体的保证,但减少了可以实现它们的类的数量.

While there are many implementing classes and subtraits, there are some basic traits in the hierarchy, each of which providing more methods or more specific guarantees, but reducing the number of classes that could implement them.

在以下小节中,我将简要描述主要特征及其背后的想法.

In the following subsections, I'll give a brief description of the main traits and the idea behind them.

这个特征很像下面描述的特征Traversable,但有一个限制,你只能使用它一次.也就是说,在 TraversableOnce 上调用的任何方法 都可能使其无法使用.

This trait is pretty much like trait Traversable described below, but with the limitation that you can only use it once. That is, any methods called on a TraversableOnce may render it unusable.

这个限制使得在集合和 Iterator 之间共享相同的方法成为可能.这使得使用 Iterator 但不使用 Iterator 特定方法的方法实际上能够使用任何集合,加上迭代器,如果重写接受 TraversableOnce.

This limitation makes it possible for the same methods to be shared between the collections and Iterator. This makes it possible for a method that works with an Iterator but not using Iterator-specific methods to actually be able to work with any collection at all, plus iterators, if rewritten to accept TraversableOnce.

因为 TraversableOnce 统一了集合和迭代器,所以它没有出现在前面只关心集合的图中.

Because TraversableOnce unifies collections and iterators, it does not appear in the previous graphs, which concern themselves only with collections.

collection 层次结构的顶部是特征 Traversable.它唯一的抽象操作是

At the top of the collection hierarchy is trait Traversable. Its only abstract operation is

def foreach[U](f: Elem => U)

该操作旨在遍历集合的所有元素,并将给定的操作 f 应用于每个元素.申请只是为了它的副作用;事实上,f 的任何函数结果都被丢弃foreach.

The operation is meant to traverse all elements of the collection, and apply the given operation f to each element. The application is done for its side effect only; in fact any function result of f is discarded by foreach.

可遍历的对象可以是有限的或无限的.无限可遍历对象的一个​​例子是流自然数Stream.from(0).方法 hasDefiniteSize 指示集合是否可能无穷.如果 hasDefiniteSize 返回 true,则集合肯定是有限的.如果返回 false,则集合尚未完全阐述,因此可能是无限的或有限的.

Traversible objects can be finite or infinite. An example of an infinite traversable object is the stream of natural numbers Stream.from(0). The method hasDefiniteSize indicates whether a collection is possibly infinite. If hasDefiniteSize returns true, the collection is certainly finite. If it returns false, the collection has not been not fully elaborated yet, so it might be infinite or finite.

这个类定义了可以在 foreach 方面有效实现的方法(超过 40 个).

This class defines methods which can be efficiently implemented in terms of foreach (over 40 of them).

这个 trait 声明了一个抽象方法 iterator,它返回一个迭代器,它一个一个地产生集合的所有元素.Iterable 中的foreach 方法是根据iterator 实现的.Iterable 的子类经常使用直接实现覆盖 foreach 以提高效率.

This trait declares an abstract method iterator that returns an iterator that yields all the collection’s elements one by one. The foreach method in Iterable is implemented in terms of iterator. Subclasses of Iterable often override foreach with a direct implementation for efficiency.

Class Iterable 还在Traversable 中添加了一些不太常用的方法,只有在iterator 可用时才能有效地实现.总结如下.

Class Iterable also adds some less-often used methods to Traversable, which can be implemented efficiently only if an iterator is available. They are summarized below.

xs.iterator          An iterator that yields every element in xs, in the same order as foreach traverses elements.
xs takeRight n       A collection consisting of the last n elements of xs (or, some arbitrary n elements, if no order is defined).
xs dropRight n       The rest of the collection except xs takeRight n.
xs sameElements ys   A test whether xs and ys contain the same elements in the same order

其他特性

Iterable 之后,有三个继承自它的基本特征:SeqSetMap.这三个都有一个 apply 方法,并且三个都实现了 PartialFunction trait,但是 apply 的含义在每种情况下都不同.

Other Traits

After Iterable there come three base traits which inherit from it: Seq, Set, and Map. All three have an apply method and all three implement the PartialFunction trait, but the meaning of apply is different in each case.

我相信SeqSetMap 的含义是直观的.在它们之后,这些类在特定的实现中分解,这些实现提供了关于性能的特定保证,以及它作为结果可用的方法.还提供了一些进一步改进的特征,例如 LinearSeqIndexedSeqSortedSet.

I trust the meaning of Seq, Set and Map is intuitive. After them, the classes break up in specific implementations that offer particular guarantees with regards to performance, and the methods it makes available as a result of it. Also available are some traits with further refinements, such as LinearSeq, IndexedSeq and SortedSet.

可能会改进下面的列表.留下评论和建议,我会修复它.

  • Traversable -- 基本集合类.可以只用 foreach 来实现.
    • TraversableProxy -- Traversable 的代理.只需将 self 指向真正的集合.
    • TraversableView -- 带有一些非严格方法的 Traversable.
    • TraversableForwarder -- 将大多数方法转发到 underlying,除了 toStringhashCodeequalsstringPrefixnewBuilderview 和所有调用创建相同类型的新可迭代对象.
    • mutable.Traversableimmutable.Traversable -- 与 Traversable 相同,但限制了集合类型.
    • 存在其他特殊情况 Iterable 类,例如 MetaData.
    • Iterable -- 可以为其创建Iterator 的集合(通过iterator).
      • IterableProxyIterableViewmutableimmutable.Iterable.
      • Traversable -- Basic collection class. Can be implemented just with foreach.
        • TraversableProxy -- Proxy for a Traversable. Just point self to the real collection.
        • TraversableView -- A Traversable with some non-strict methods.
        • TraversableForwarder -- Forwards most methods to underlying, except toString, hashCode, equals, stringPrefix, newBuilder, view and all calls creating a new iterable object of the same kind.
        • mutable.Traversable and immutable.Traversable -- same thing as Traversable, but restricting the collection type.
        • Other special-cases Iterable classes, such as MetaData, exists.
        • Iterable -- A collection for which an Iterator can be created (through iterator).
          • IterableProxy, IterableView, mutable and immutable.Iterable.
          • CountedIterator -- 一个定义 countIterator,它返回目前看到的元素.
          • BufferedIterator -- 定义head,它返回下一个元素而不消耗它.
          • 存在其他特殊情况 Iterator 类,例如 Source.
          • CountedIterator -- An Iterator defining count, which returns the elements seen so far.
          • BufferedIterator -- Defines head, which returns the next element without consuming it.
          • Other special-cases Iterator classes, such as Source, exists.
          • Map -- Tuple2Iterable,它还提供了检索值(元组的第二个元素)的方法键(元组的第一个元素).也扩展了 PartialFunction.
            • MapProxy -- 一个 MapProxy.
            • DefaultMap -- 实现一些 Map 抽象方法的特征.
            • SortedMap -- 键已排序的 Map.
              • immutable.SortMap
                • immutable.TreeMap -- 一个实现 immutable.SortedMap 的类.
                • Map -- An Iterable of Tuple2, which also provides methods for retrieving a value (the second element of the tuple) given a key (the first element of the tuple). Extends PartialFunction as well.
                  • MapProxy -- A Proxy for a Map.
                  • DefaultMap -- A trait implementing some of Map's abstract methods.
                  • SortedMap -- A Map whose keys are sorted.
                    • immutable.SortMap
                      • immutable.TreeMap -- A class implementing immutable.SortedMap.
                      • immutable.MapProxy
                      • immutable.HashMap -- 通过键散列实现 immutable.Map 的类.
                      • immutable.IntMap -- 实现 immutable.Map 的类,专用于 Int 键.使用基于密钥的二进制数字的树.
                      • immutable.ListMap -- 通过列表实现 immutable.Map 的类.
                      • immutable.LongMap -- 一个实现 immutable.Map 的类,专门用于 Long 键.参见 IntMap.
                      • 还有针对特定数量元素优化的其他类.
                      • immutable.MapProxy
                      • immutable.HashMap -- A class implementing immutable.Map through key hashing.
                      • immutable.IntMap -- A class implementing immutable.Map specialized for Int keys. Uses a tree based on the binary digits of the keys.
                      • immutable.ListMap -- A class implementing immutable.Map through lists.
                      • immutable.LongMap -- A class implementing immutable.Map specialized for Long keys. See IntMap.
                      • There are additional classes optimized for an specific number of elements.
                      • mutable.HashMap -- 通过键散列实现 mutable.Map 的类.
                      • mutable.ImmutableMapAdaptor -- 从现有的 immutable.Map 实现 mutable.Map 的类.
                      • mutable.LinkedHashMap -- ?
                      • mutable.ListMap -- 通过列表实现 mutable.Map 的类.
                      • mutable.MultiMap -- 每个键接受多个不同值的类.
                      • mutable.ObservableMap -- 一个 mixin,当与 Map 混合时,通过 Publisher<向观察者发布事件/code> 界面.
                      • mutable.OpenHashMap -- 基于开放散列算法的类.
                      • mutable.SynchronizedMap -- 一个 mixin 应该与 Map 混合以提供一个带有同步方法的版本.
                      • mutable.MapProxy.
                      • mutable.HashMap -- A class implementing mutable.Map through key hashing.
                      • mutable.ImmutableMapAdaptor -- A class implementing a mutable.Map from an existing immutable.Map.
                      • mutable.LinkedHashMap -- ?
                      • mutable.ListMap -- A class implementing mutable.Map through lists.
                      • mutable.MultiMap -- A class accepting more than one distinct value for each key.
                      • mutable.ObservableMap -- A mixin which, when mixed with a Map, publishes events to observers through a Publisher interface.
                      • mutable.OpenHashMap -- A class based on an open hashing algorithm.
                      • mutable.SynchronizedMap -- A mixin which should be mixed with a Map to provide a version of it with synchronized methods.
                      • mutable.MapProxy.
                      • Seq -- 元素序列.一种假设是明确定义的大小和元素重复.也扩展了 PartialFunction.
                        • IndexedSeq -- 支持 O(1) 元素访问和 O(1) 长度计算的序列.
                          • IndexedSeqView
                          • immutable.PagedSeq -- IndexedSeq 的实现,其中元素由通过构造函数传递的函数按需生成.
                          • immutable.IndexedSeq
                            • immutable.Range -- 一个分隔的整数序列,在低端封闭,在高端开放,并带有一个台阶.
                              • immutable.Range.Inclusive -- 一个 Range 也关闭了高端.
                              • immutable.Range.ByOne -- 步长为 1 的 Range.
                              • Seq -- A sequence of elements. One assumes a well-defined size and element repetition. Extends PartialFunction as well.
                                • IndexedSeq -- Sequences that support O(1) element access and O(1) length computation.
                                  • IndexedSeqView
                                  • immutable.PagedSeq -- An implementation of IndexedSeq where the elements are produced on-demand by a function passed through the constructor.
                                  • immutable.IndexedSeq
                                    • immutable.Range -- A delimited sequence of integers, closed on the lower end, open on the high end, and with a step.
                                      • immutable.Range.Inclusive -- A Range closed on the high end as well.
                                      • immutable.Range.ByOne -- A Range whose step is 1.
                                      • immutable.NumericRange.Inclusiveimmutable.NumericRange.Exclusive.
                                      • immutable.WrappedString, immutable.RichString -- 能够将 String 视为 Seq[Char],同时仍然保留 String 方法.我不确定它们之间有什么区别.
                                      • immutable.NumericRange.Inclusive, immutable.NumericRange.Exclusive.
                                      • immutable.WrappedString, immutable.RichString -- Wrappers which enables seeing a String as a Seq[Char], while still preserving the String methods. I'm not sure what the difference between them is.
                                      • mutable.GenericArray -- 基于 Seq 的类似数组的结构.注意类"Array是Java的Array,与其说是类,不如说是一种内存存储方法.
                                      • mutable.ResizableArray -- 基于可调整大小数组的类使用的内部类.
                                      • mutable.PriorityQueue, mutable.SynchronizedPriorityQueue -- 实现优先队列的类 -- 元素首先根据 Ordering 出队的队列, 以及最后排队的顺序.
                                      • mutable.PriorityQueueProxy -- PriorityQueue 的抽象 Proxy.
                                      • mutable.GenericArray -- An Seq-based array-like structure. Note that the "class" Array is Java's Array, which is more of a memory storage method than a class.
                                      • mutable.ResizableArray -- Internal class used by classes based on resizable arrays.
                                      • mutable.PriorityQueue, mutable.SynchronizedPriorityQueue -- Classes implementing prioritized queues -- queues where the elements are dequeued according to an Ordering first, and order of queueing last.
                                      • mutable.PriorityQueueProxy -- an abstract Proxy for a PriorityQueue.
                                      • immutable.LinearSeq
                                        • immutable.List -- 一个不可变的、单链接的列表实现.
                                        • immutable.Stream -- 一个惰性列表.它的元素仅按需计算,但随后被记忆(保存在内存中).理论上可以是无限的.
                                        • immutable.LinearSeq
                                          • immutable.List -- An immutable, singlely-linked, list implementation.
                                          • immutable.Stream -- A lazy-list. Its elements are only computed on-demand, but memoized (kept in memory) afterwards. It can be theoretically infinite.
                                          • mutable.DoublyLinkedList -- 一个包含可变 prevhead (elem) 和 的列表尾 (next).
                                          • mutable.LinkedList -- 一个带有可变 head (elem) 和 tail (下一个).
                                          • mutable.MutableList -- 在内部用于实现基于可变列表的类的类.
                                            • mutable.Queue, mutable.QueueProxy -- 针对 FIFO(先进先出)操作优化的数据结构.
                                            • mutable.QueueProxy -- mutable.QueueProxy.
                                            • mutable.DoublyLinkedList -- A list with mutable prev, head (elem) and tail (next).
                                            • mutable.LinkedList -- A list with mutable head (elem) and tail (next).
                                            • mutable.MutableList -- A class used internally to implement classes based on mutable lists.
                                              • mutable.Queue, mutable.QueueProxy -- A data structure optimized for FIFO (First-In, First-Out) operations.
                                              • mutable.QueueProxy -- A Proxy for a mutable.Queue.
                                              • immutable.Queue -- 一个实现 FIFO 优化(先进先出)数据结构的类.mutableimmutable 队列没有共同的超类.
                                              • immutable.Stack -- 实现 LIFO 优化(后进先出)数据结构的类.mutable immutable 堆栈没有共同的超类.
                                              • immutable.Vector -- ?
                                              • scala.xml.NodeSeq -- 扩展 immutable.Seq 的专用 XML 类.
                                              • immutable.IndexedSeq -- 如上所示.
                                              • immutable.LinearSeq -- 如上所示.
                                              • immutable.Queue -- A class implementing a FIFO-optimized (First-In, First-Out) data structure. There is no common superclass of both mutable and immutable queues.
                                              • immutable.Stack -- A class implementing a LIFO-optimized (Last-In, First-Out) data structure. There is no common superclass of both mutable immutable stacks.
                                              • immutable.Vector -- ?
                                              • scala.xml.NodeSeq -- A specialized XML class which extends immutable.Seq.
                                              • immutable.IndexedSeq -- As seen above.
                                              • immutable.LinearSeq -- As seen above.
                                              • mutable.Buffer -- 可以通过附加、前置或插入新成员来更改的元素序列.
                                                • mutable.ArrayBuffer -- mutable.Buffer 类的实现,对于追加、更新和随机访问操作具有固定的分摊时间.它有一些专门的子类,例如 NodeBuffer.
                                                • mutable.BufferProxymutable.SynchronizedBuffer.
                                                • mutable.ListBuffer -- 由列表支持的缓冲区.它提供恒定时间追加和前置,大多数其他操作都是线性的.
                                                • mutable.ObservableBuffer -- 一个 mixin trait,当与 Buffer 混合时,通过 Publisher<提供通知事件/code> 接口.
                                                • mutable.IndexedSeq -- 如上所示.
                                                • mutable.LinearSeq -- 如上所示.
                                                • mutable.Buffer -- Sequence of elements which can be changed by appending, prepending or inserting new members.
                                                  • mutable.ArrayBuffer -- An implementation of the mutable.Buffer class, with constant amortized time for the append, update and random access operations. It has some specialized subclasses, such as NodeBuffer.
                                                  • mutable.BufferProxy, mutable.SynchronizedBuffer.
                                                  • mutable.ListBuffer -- A buffer backed by a list. It provides constant time append and prepend, with most other operations being linear.
                                                  • mutable.ObservableBuffer -- A mixin trait which, when mixed to a Buffer, provides notification events through a Publisher interfaces.
                                                  • mutable.IndexedSeq -- As seen above.
                                                  • mutable.LinearSeq -- As seen above.
                                                  • Set -- 一个集合是一个集合,最多包含一个任何对象.
                                                    • BitSet -- 存储为位集的一组整数.
                                                      • immutable.BitSet
                                                      • mutable.BitSet
                                                      • Set -- A set is a collection that includes at most one of any object.
                                                        • BitSet -- A set of integers stored as a bitset.
                                                          • immutable.BitSet
                                                          • mutable.BitSet
                                                          • immutable.SortedSet
                                                            • immutable.TreeSet -- 基于树的 SortedSet 的实现.
                                                            • immutable.SortedSet
                                                              • immutable.TreeSet -- An implementation of a SortedSet based on a tree.
                                                              • immutable.HashSet -- 基于元素散列的 Set 实现.
                                                              • immutable.ListSet -- 基于列表的 Set 实现.
                                                              • 存在额外的集合类来为 0 到 4 个元素的集合提供优化的实现.
                                                              • immutable.SetProxy -- 一个用于不可变 SetProxy.
                                                              • immutable.HashSet -- An implementation of Set based on element hashing.
                                                              • immutable.ListSet -- An implementation of Set based on lists.
                                                              • Additional set classes exists to provide optimized implementions for sets from 0 to 4 elements.
                                                              • immutable.SetProxy -- A Proxy for an immutable Set.
                                                              • mutable.HashSet -- 基于元素散列的 Set 实现.
                                                              • mutable.ImmutableSetAdaptor -- 从不可变的 Set 实现可变 Set 的类.
                                                              • LinkedHashSet -- 基于列表的 Set 实现.
                                                              • ObservableSet -- 一个 mixin trait,当与 Set 混合时,通过 Publisher 提供通知事件> 界面.
                                                              • SetProxy -- SetProxy.
                                                              • SynchronizedSet -- 一个 mixin trait,当与 Set 混合时,通过 Publisher 提供通知事件> 界面.
                                                              • mutable.HashSet -- An implementation of Set based on element hashing.
                                                              • mutable.ImmutableSetAdaptor -- A class implementing a mutable Set from an immutable Set.
                                                              • LinkedHashSet -- An implementation of Set based on lists.
                                                              • ObservableSet -- A mixin trait which, when mixed with a Set, provides notification events through a Publisher interface.
                                                              • SetProxy -- A Proxy for a Set.
                                                              • SynchronizedSet -- A mixin trait which, when mixed with a Set, provides notification events through a Publisher interface.
                                                              • 为什么存在 Like 类(例如 TraversableLike)

                                                              这样做是为了实现最大的代码重用.具有特定结构(可遍历、映射等)的类的具体通用实现是在 Like 类中完成的.然后,用于一般消费的类会覆盖可以优化的选定方法.

                                                              This was done to achieve maximum code reuse. The concrete generic implementation for classes with a certain structure (a traversable, a map, etc) is done in the Like classes. The classes intended for general consumption, then, override selected methods that can be optmized.

                                                              • 伴随方法的用途(例如 List.companion)

                                                              类的构建器,即知道如何以一种可以被诸如 map 之类的方法使用的方式创建该类实例的对象,是由伴随对象中的一个方法创建的.因此,为了构建类型 X 的对象,我需要从 X 的伴随对象中获取该构建器.不幸的是,在 Scala 中无法从类 X 获取到对象 X.因此,有在 X 的每个实例中定义的方法,companion,它返回类 X 的伴随对象.

                                                              The builder for the classes, ie, the object which knows how to create instances of that class in a way that can be used by methods like map, is created by a method in the companion object. So, in order to build an object of type X, I need to get that builder from the companion object of X. Unfortunately, there is no way, in Scala, to get from class X to object X. Because of that, there is a method defined in each instance of X, companion, which returns the companion object of class X.

                                                              虽然在普通程序中可能会使用这种方法,但其目标是在集合库中实现代码重用.

                                                              While there might be some use for such method in normal programs, its target is enabling code reuse in the collection library.

                                                              • 我如何知道在给定点的范围内有哪些隐式对象

                                                              你不应该关心那个.它们是隐式的,因此您无需弄清楚如何使其工作.

                                                              You aren't supposed to care about that. They are implicit precisely so that you don't need to figure out how to make it work.

                                                              这些隐式的存在是为了使集合上的方法能够在父类上定义,但仍然返回相同类型的集合.例如,map 方法定义在 TraversableLike 上,但如果你在 List 上使用,你会得到一个 List返回.

                                                              These implicits exists to enable the methods on the collections to be defined on parent classes but still return a collection of the same type. For example, the map method is defined on TraversableLike, but if you used on a List you'll get a List back.

                                                              这篇关于Scala 2.8 集合设计教程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆