看到那个“yield是占位符”的帖子我就有些疑惑了。
在我的印象中,Ruby Yield, Python Yield, C# Yield 都是用来实现 coroutine的。都可以用来实现 iterator, generator。既然是 coroutine,自然是 context switch。
不过,我还记得 cookoo 的 python vs ruby 帖子,里面说,ruby yield 和 python yield 不是一回事,python yield 是用来产生 generator的。
看了这个帖子上面的讨论,发现所有语言的yield 原来还都是一回事。都是用来表示 coroutine。
想想也是。yield 这个词也不是随便用的。都已经约定俗成表示coroutine了。
-------------------------
yield的大致含义:
yield 基本等于 return。
用在一串顺序指令中间。
yield 1;
yield 2;
yield 3;
需要注意的是,
return 1;
return 2;
return 3;
return这种写法是无法通过的。
yield 就可以。因为 yield 允许在顺序指令中主动中断。
yield 还同时保存了当前的 runtime stack & context。所以,是可以重入的。下次context切换回来,stack/context 就恢复了。可以继续执行。
yield 的用途就是用来 产生序列,一串顺序的yield可以构造一个发生器/generator/ iterator。
所以,在发生器方面,ruby yield 和 python yield / c# yield 的含义是相同的。
所不同的方面是接受器方面。ruby yield 的接受器方面要求一个 block 来接受 yield 产生的每一步序列。
这是一个 iterator lazy fetch 的过程。
receiver 执行 next, 切换到 generator。
generator 执行 yield 切换到 receiver。
这样一步一步合作执行。
参见这个帖子的回复
http://www.iteye.com/topic/21293
buaawhl 写道
关于coroutine, yield, iterator, ajoo有些文章和代码可以作为很好的参考。
http://jroller.com/page/ajoo?entry=yield_support_in_java
这个blog讲述了基本思想。
http://www.sourceforge.net/projects/jfunctional
这个项目的代码包括了一个 yield package,是 yield coroutine iterator的实现。
-------
另外, c#支持coroutine yield iterator。
我找到了一篇CLR关于这方面支持的ppt文档,有兴趣可以参阅。
http://research.microsoft.com/workshops/SSCLI2005/presentations/Ierusalimschy-Mascarenhas.ppt