标签:
D语言标准库中是这么解释Range的:
Ranges generalize the concept of arrays,lists, or anything that involves sequential access
意思是Range概括的数组,列表,或任何涉及顺序访问的概念,我们就叫它序列集吧,以区分aggregate(迭代集)与sets(键值集)。
包文件range.d
把几个序列集连接到成一个序列集.
import std.stdio; import std.range; int main(string[] argv) { int[] a = [1,2,3]; int[] b = [4,5,6]; auto c = chain(a , b); writeln("c len:",c.length); writeln("c:",c); writeln("c type is:",typeid(c)); writeln("c[0]:",c[0]); writeln("c[3]:",c[3]); writeln("Items List:"); foreach(i;c) { writeln(i); } readln(); return 0; }
从运行结果来看,chain是把两个数组连接为一个对象,类型为std.range.chain(int[],int[]).chain.Result类型。
对这个单一的对象可以使用foreach操作来处理。也可以使用索引来访问,很不错的东西,看起来好像比C#里的IEnumerable功能多点,但IEnumerable的抽象更高一些,没有要求顺序访问和元素数量,只要求能迭代,可能aggregate是指的这个概念。
IEnumerable只要求能枚举元素,这一点很重要,因为很多时候,不能要求数据都在内存中,比如对数据库记录的访问,数据很可能并不在内存中,如果有了数量的要求,那么也就使得Range不能很好的处理数据库数据访问问题。
因此,Range只能叫做序列集,而不能称为枚举集,或是迭代集。而序列集应该也是属于迭代集的一种,既然Range是迭代集的一种,那么他是怎么实现让foreach访问的呢? 值研究的一个问题。
标签:
原文地址:http://www.cnblogs.com/wanhongnan/p/5726727.html