Re: 疑问:yield到底是怎么运作的?

看到那个“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

[quote="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
[/quote]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值