Iterator = Generators??

长话短说,C# 2.0中的Iterator语法实际上就是取代自己写一个IEnumerator实现的麻烦,它的语法比较简明,大大提高了编码效率,示例如下:

ExpandedBlockStart.gif ContractedBlock.gif public  IEnumerator GetEnumerator()  dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif   
for (int i = 0; i < this.items.Count; i++dot.gif{
InBlock.gif      yield 
return this.items[i];
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}

在Boo中,这种IEnumerator的功能是通过Generator来实现的,而且有三种Generator语法形式:

  • Generator Expression
  • Generator Method
  • List Comprehension

其实这三种形式都差不多,下面我们来看个实际的例子。这里假设我们要创建一个Stack类,要为这个Stack提供遍历功能,以下依次展示C# 2.0以及Boo三种形式的Generator的实现示例:

C# 2.0

ExpandedBlockStart.gif ContractedBlock.gif public  IEnumerator < T >  GetEnumerator()  dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif   
for (int i = this.items.Count - 1; i >= 0; i--dot.gif{
InBlock.gif      yield 
return this.items[i];
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}

Generator Expression

None.gif # 因为Generator并不是IEnumerator类型,所以需要调用Generator的GetEnumerator方法。
None.gifdef GetEnumerator() 
as  IEnumerator:
None.gif   
return  (item  for  item  in  self.items.Reversed).GetEnumerator()

Generator Method

None.gif # 就像你所看到的,Generator Method与C#  2 .0的语法差不多。
None.gifdef Iterator():
None.gif   
for  item  in  self.items.Reversed:
None.gif      yield item

List Comprehension

None.gif # 这里返回的就不是Generator类型了,而是一个List,
None.gif# 等于把Generator转换成List。
None.gifdef GetItems() 
as  List:
None.gif   
return  [item  for  item  in  self.items.Reversed]

其实这个语法很简单,不过Generator真正好用的地方在于它同时支持表达式与条件,比如我想取出所有增大后不大于100的元素,那么我可以这样写Generator:

None.gif generator  =  item  for  Increase(item)  in  items  if  item  <=   100

总的来说,Boo的Generator语法要比C#的灵活些,不过并不是能做什么C#做不到的事情或者很复杂的事情,这些简便的语法也是充分吸取了Python的优点。

转载于:https://www.cnblogs.com/cavingdeep/archive/2005/07/29/203159.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值