更新“易语言.飞扬”编译器,改进“遍历循环(foreach)”
2007-11-13 20:10
429 查看
(2007.11.13)
今天更新了“易语言.飞扬”编译器,改进了“遍历循环(foreach)”。
之前的“遍历循环”,支持对数组和“可遍历对象”进行遍历;改进后的“遍历循环”,支持对数组和“遍历器对象”进行遍历。
对数组的支持都是特例,下面重点对比一下之前的“可遍历对象”和现在的“遍历器对象”。
之前对“可遍历对象”的定义为:具有公开的“创建遍历器()”方法的对象,此方法返回一个“遍历器对象”。“遍历循环”自动查找并调用“创建遍历器()”方法获取“遍历器对象”。
“遍历循环”接收“可遍历对象”作为参数的话,意味着这个对象只能(通过“创建遍历器()”)创建一个(一种)“遍历器对象”,即只能以“一种”特定的方式被遍历。但实际的需求中,可能需要对同一个对象进行不同方式的遍历,如二叉树对象,可能需要前序遍历、后序遍历、中序遍历。之前的“遍历循环”显然是无法满足此需求的。
改进后的“遍历循环”,接收“遍历器对象”作为参数,把“创建遍历器”的动作交给用户(或类库),很大程度上提高了程序和类库的灵活性。例如二叉树对象,可以提供“创建前序遍历器()”“创建后序遍历器()”“创建中序遍历器()”等方法,分别创建出不同的“遍历器对象”,从而满足上述多种遍历方式的需求。
此次修改前后,对“遍历器对象”的定义没有改变,它是这样一个对象:
1、必须有一个或多个标记为“遍历方法”的方法(称为“遍历方法”)
2、“遍历方法”必须是公开的、无参数的,必须返回两个值:第一个返回值为任意数据类型,用于返回当前遍历出的数据;第二个返回值为逻辑型,为真表示第一个返回值有效,为假表示第一个返回值无效且整个遍历过程已经结束。
3、“遍历方法”的名称可以为任意合法名称
一个简单的“遍历器对象”类是这样的:
公开 类 我的遍历器
{
私有 整数 num = 0;
公开 整数,逻辑 取下一个整数() <遍历方法>
{
num++;
如果(num >= 6)
返回 (0, 假);
否则
返回 (num, 真);
}
}
它的对象(“遍历器对象”)可被“遍历循环”接收(遍历时自动查找并循环调用其特定的“遍历方法”,直到遍历结束——“遍历方法”的第二个返回值为假):
遍历循环 (创建 我的遍历器(), 整数 i)
{
控制台.输出(i); //将分别输出 1 2 3 4 5
}
“遍历循环”的一个巨大优势在于,它支持从“遍历器对象”中遍历出多种数据类型的数据,只要“遍历器对象”具有相应类型的“遍历方法”。
例如,为前面的“我的遍历器”类添加如下方法之后:
公开 文本,逻辑 取下一个文本() <遍历方法>
{
(整数 i, 逻辑 b) = 取下一个整数();
返回 (i.到文本(), b);
}
就可以从中遍历出文本数据了:
遍历循环 (创建 我的遍历器(), 文本 s)
{
控制台.输出(s); //将分别输出 "1" "2" "3" "4" "5"
}
您可能已经发现了,EF并没有限定“遍历循环”两个参数的类型,没有要求必须继承自哪个类或实现哪个接口,只是从对象的“内容”上进行了适当的约束。这对“静态数据类型”的编程语言来说,已经难能可贵了。单从这一点上来说,“易语言.飞扬”(EF)虽然没有引入“泛型”,却达到了“泛型”的效果;“易语言.飞扬”(EF)虽然不是动态编程语言,却达到了“弱类型”的效果。更重要的是,“易语言.飞扬”在得到这些好处的同时,并没有丢掉静态编程语言固有的“类型安全检查”的优势。
此次修改,取消了“可遍历对象”概念,突出了“遍历器对象”概念。提高了灵活性,降低了复杂性。
http://dotef.cn
今天更新了“易语言.飞扬”编译器,改进了“遍历循环(foreach)”。
之前的“遍历循环”,支持对数组和“可遍历对象”进行遍历;改进后的“遍历循环”,支持对数组和“遍历器对象”进行遍历。
对数组的支持都是特例,下面重点对比一下之前的“可遍历对象”和现在的“遍历器对象”。
之前对“可遍历对象”的定义为:具有公开的“创建遍历器()”方法的对象,此方法返回一个“遍历器对象”。“遍历循环”自动查找并调用“创建遍历器()”方法获取“遍历器对象”。
“遍历循环”接收“可遍历对象”作为参数的话,意味着这个对象只能(通过“创建遍历器()”)创建一个(一种)“遍历器对象”,即只能以“一种”特定的方式被遍历。但实际的需求中,可能需要对同一个对象进行不同方式的遍历,如二叉树对象,可能需要前序遍历、后序遍历、中序遍历。之前的“遍历循环”显然是无法满足此需求的。
改进后的“遍历循环”,接收“遍历器对象”作为参数,把“创建遍历器”的动作交给用户(或类库),很大程度上提高了程序和类库的灵活性。例如二叉树对象,可以提供“创建前序遍历器()”“创建后序遍历器()”“创建中序遍历器()”等方法,分别创建出不同的“遍历器对象”,从而满足上述多种遍历方式的需求。
此次修改前后,对“遍历器对象”的定义没有改变,它是这样一个对象:
1、必须有一个或多个标记为“遍历方法”的方法(称为“遍历方法”)
2、“遍历方法”必须是公开的、无参数的,必须返回两个值:第一个返回值为任意数据类型,用于返回当前遍历出的数据;第二个返回值为逻辑型,为真表示第一个返回值有效,为假表示第一个返回值无效且整个遍历过程已经结束。
3、“遍历方法”的名称可以为任意合法名称
一个简单的“遍历器对象”类是这样的:
公开 类 我的遍历器
{
私有 整数 num = 0;
公开 整数,逻辑 取下一个整数() <遍历方法>
{
num++;
如果(num >= 6)
返回 (0, 假);
否则
返回 (num, 真);
}
}
它的对象(“遍历器对象”)可被“遍历循环”接收(遍历时自动查找并循环调用其特定的“遍历方法”,直到遍历结束——“遍历方法”的第二个返回值为假):
遍历循环 (创建 我的遍历器(), 整数 i)
{
控制台.输出(i); //将分别输出 1 2 3 4 5
}
“遍历循环”的一个巨大优势在于,它支持从“遍历器对象”中遍历出多种数据类型的数据,只要“遍历器对象”具有相应类型的“遍历方法”。
例如,为前面的“我的遍历器”类添加如下方法之后:
公开 文本,逻辑 取下一个文本() <遍历方法>
{
(整数 i, 逻辑 b) = 取下一个整数();
返回 (i.到文本(), b);
}
就可以从中遍历出文本数据了:
遍历循环 (创建 我的遍历器(), 文本 s)
{
控制台.输出(s); //将分别输出 "1" "2" "3" "4" "5"
}
您可能已经发现了,EF并没有限定“遍历循环”两个参数的类型,没有要求必须继承自哪个类或实现哪个接口,只是从对象的“内容”上进行了适当的约束。这对“静态数据类型”的编程语言来说,已经难能可贵了。单从这一点上来说,“易语言.飞扬”(EF)虽然没有引入“泛型”,却达到了“泛型”的效果;“易语言.飞扬”(EF)虽然不是动态编程语言,却达到了“弱类型”的效果。更重要的是,“易语言.飞扬”在得到这些好处的同时,并没有丢掉静态编程语言固有的“类型安全检查”的优势。
此次修改,取消了“可遍历对象”概念,突出了“遍历器对象”概念。提高了灵活性,降低了复杂性。
http://dotef.cn
相关文章推荐
- Mybatis 循环遍历 foreach
- R语言点滴记录(数组、矩阵运算;遍历子文件夹等,更新中)
- JavaScript数组循环遍历之forEach
- Javascript 数组循环遍历之forEach
- 编写高质量代码改善C#程序的157个建议——建议17:多数情况下使用foreach进行循环遍历
- java.util.ArrayList在foreach循环遍历时删除元素的问题
- Javascript数组循环遍历之forEach详解
- 黑马程序员_两种遍历集合的方法Iterator接口和foreach循环
- Javascript 数组循环遍历之forEach
- Javascript 数组循环遍历之forEach
- Javascript 数组循环遍历之forEach
- Java中遍历数组使用foreach循环还是for循环?
- for 循环和 foreach 循环在遍历时的区别与联系
- SSIS中循环遍历组件[Foreach Loop Container]
- Javascript 数组循环遍历之forEach
- javascript通用循环遍历方法forEach
- 接受POST表单传过来的信息 可以用foreach循环进行遍历操作
- Java学习之容器上(Collection接口常用方法,Iterator接口,使用foreach循环遍历Collection集合元素,Set集合通用知识(Hashset类,hashcode()与LinkedHashSet类))
- foreach循环遍历二维数组
- [破除迷信]java.util.ArrayList在foreach循环遍历时可以删除元素