可迭代和可枚举之间有区别吗?


16

许多语言似乎具有非常相似的结构,称为可迭代或可枚举。这些是可以迭代或枚举的结构,在我看来,它们极为相似。这些单词是同义的还是可迭代的和可枚举的之间存在细微的语义差异,这证明了术语的选择是正确的?


1
这个人自己,乔恩·斯凯特(Jon Skeet)在他的书中感叹C#与Enumerable一起使用,而不是Iterable。这个决定导致了很多这种混乱。
RubberDuck

Answers:


13

恕我直言,这取决于上下文,有时它们是同义词,有时则不是。例如,在C#中,您具有数据类型“ IEnumerable”,该数据类型对迭代器进行了分类,但是您还具有“ enum”声明,该声明用于符号常量,而不是专门用于迭代。在其他编程语言(或其他上下文)中,情况可能相似还是不同。

如果您将两个单词当作英语动词,而不是专门作为编程语言的关键字来表达,那么

  • 迭代的意思是“一个接一个地遍历集合的所有元素”
  • 枚举的意思是“给一个集合的每个元素一个序数,一个接一个”

而且由于枚举需要进行迭代,并且枚举意味着某种迭代,因此通常可以互换这两个过程描述。


3
+1为什么您会提及枚举?枚举作为结构与可枚举是正交的吗?虽然我猜你可能会说一个枚举的本质是“给一个集合中的每个常量一个序数,一个接一个” ... :)
Marjan Venema 2013年

@MarjanVenema:好吧,关键字“枚举”来自枚举 - 很好,我猜呢?
布朗

D'哦,我会这么说。我以错误的方式弄到了鸡肉和鸡蛋:-)
Marjan Venema 2013年

3
@DocBrown-枚举是枚举的缩写。
李,

3
@李:这是一个反问;-)
布朗

4

就像其他人所说的那样,精确的语义取决于使用这些术语的编程语言,因此我将进行纯粹的语言评估。

“可迭代”是一个新词,显然是指许多语言内置的“迭代”和“迭代器”。因此,此类类型几乎肯定支持迭代器,但不一定支持任何其他迭代器,也不一定支持除此以外的任何迭代器。最基本的迭代器功能:每个项目处理一次。可能支持或可能不支持反转,删除,测量距离等。

“可枚举”是指列举的事情,这可能意味着相同的迭代,但前提是语言还没有使用“迭代”为了这个目的。如果一种语言兼有,那么“无数”几乎可以肯定意味着其他东西,可能更强大。它很可能支持将每个元素与唯一的数字索引相连的概念,并且可能允许随机访问(例如,在第一个和第二个元素之前检索第三个元素)。

这就是您可以从单词中合理推断出的所有含义。在任何具体情况下,请参考标准库API文档。


1

我想集中讨论两个术语的严格定义

Iterable 就是迭代事物,并一一访问元素。

我认为该术语Enumerable起源于车床。这是关于以正确顺序逐一列出元素的能力。事物可以一一列出countable,每个都有唯一的对应索引。给定一个元素,您可以获得唯一索引。给定一个索引,您只能找到一个与该索引关联的可能元素。

换句话说,Enumerable意味着生成元素的能力。例如,某些编程语言Haskell已经实现了这一想法。有一个Enum类型的类,并且Char是一个实例。

Prelude> fromEnum True
1
Prelude> fromEnum False
0
Prelude> toEnum 1 :: Bool
True

Prelude> fromEnum 'a'
97
Prelude> enumFromTo 'a' (toEnum 122 :: Char)
"abcdefghijklmnopqrstuvwxyz"

-1

枚举是计数,迭代是重播

第二个枚举将产生相同的数字,迭代可能是变化

分形是通过函数的迭代构建的,在最后一次迭代的结果上重复该函数,每个迭代具有不同的值

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.