Iterator = Generators??
长话短说,C# 2.0中的Iterator语法实际上就是取代自己写一个IEnumerator实现的麻烦,它的语法比较简明,大大提高了编码效率,示例如下:
public IEnumerator GetEnumerator() {
for (int i = 0; i < this.items.Count; i++) {
yield return this.items[i];
}
}
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];
}
}
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()
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
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转换成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的优点。