Iterator = Generators??

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

public IEnumerator GetEnumerator() {
   
for (int i = 0; i < this.items.Count; i++{
      yield 
return this.items[i];
   }

}

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

  • Generator Expression
  • Generator Method
  • List Comprehension

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

C# 2.0

public IEnumerator<T> GetEnumerator() {
   
for (int i = this.items.Count - 1; i >= 0; i--{
      yield 
return this.items[i];
   }

}

Generator Expression

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

Generator Method

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

List Comprehension

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

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

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

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

posted @ 2005-07-29 21:52  Cavingdeep  阅读(921)  评论(1编辑  收藏  举报