最早看到yield时,就用c/C++中的概念对比了一番,发现最接近就是“宏代码的展开”。粗看起来,这样的理解是可以的。不过马上就有个问题出来了,就是定义域。宏代码的展开,要求展开后的代码处于被展开的位置同一个定义域,否则,相关变量和函数就会出现没有定义的错误。 不过从下面的ruby代码来看,yield没有这样的问题存在
class A
def self.test
yield
end
end
class B
def test0
puts "call from class B"
end
def test1
A.test {test0}
end
end
b = B.new
b.test1
如果以代码展开的角度来理解上面代码的运行,那么就应该出现test0 不是A的函数这样的错误提示。不过运行下来很成功,没有出现任何错误。
还有一种可能是ruby的函数调用,就像C++一样,默认附带一个this对象。
def test1
A.test {test0}
end
这段代码在执行时是不是被修改成了
def test1
A.test {@this.test0}
end
ruby如果真有这个功能,上面代码的执行似乎能够说的通。
不过上面都是猜测,看下《Programming Ruby - 2nd》第一次提到yield的时候得说明
引用
First, a block may appear only in the source adjacent to a method call; the block is written starting on the same line as the method call’s last parameter (or the closing parenthesis of the parameter list). Second, the code in the block is not executed at the time it is encountered. Instead, Ruby remembers the context in which the block appears (the local variables, the current object, and so on) and then enters the method. This is where the magic starts.
Within the method, the block may be invoked, almost as if it were a method itself, using the yield statement. Whenever a yield is executed, it invokes the code in the block.When the block exits, control picks back up immediately after the yield.1 Let’s start
with a trivial example.
def three_times
yield
yield
yield
end
three_times { puts "Hello" }
produces:
Hello
Hello
Hello
这段文字提到了3点。
第一,保存block相关的context
第二,block调用像函数本身的一部分
第三,有个神秘的control在操纵这一切
如果第一点,可以看作ruby给test0附加了个this对象,但是第二第三个就说不通了,如果只是代码展开,第二第三就不需要说明了。
看来关于yield是代码展开的想法是完全错的。
那么从第三点来看,yield的确有个代码运行块(先这样叫着)切换的动作,最后运行完了又切换回来.
加入代码切换的说法之后,给出的例子代码似乎是这样运行的
1.运行A.test的上半部分直到遇到yield
2.写入block的context,同时使用block的context和A.test运行到一半的context,作为block的运行环境来运行block代码,
3.block运行完毕,清除block的context,然后继续运行A.test的下半部分。
古怪阿古怪,yield是真的这样运行的吗?
从前面yield的翻译讨论来看,yield带有切换,退让,让步这类的意思。
yield如果有执行代码切换的功能,多少带有超级微型线程的意思了。而且是主动切换,执行代码主体。
yield完全是一个控制代码执行顺序的关键字了。真神奇。
分享到:
- 2006-10-31 08:57
- 浏览 13143
- 评论(31)
- 论坛回复 / 浏览 (31 / 31023)
- 查看更多
相关推荐
Pb 中 Yield() 函数的使用 Yield() 函数是 PowerBuilder 中一个非常有用的函数,它可以将控制权转移给其他图形对象,包括非 PowerBuilder 对象。该函数检测消息队列,如果有消息,就把消息取出。该函数返回布尔型值...
Python中的yield表达式是一个极为重要的概念,它是生成器(generator)的核心组成部分。生成器在处理大量数据时显得尤为有用,因为它可以逐个产生数据项而不是一次性加载所有数据到内存中。这不仅可以节省内存,还能...
Java线程让步(Yield)是Java多线程编程中的一个重要概念,它涉及到线程调度和并发控制。在多线程环境下,线程让步意味着一个正在运行的线程主动放弃当前的时间片,以便其他就绪状态的线程有机会执行。这与线程的...
pkg yield yield是Riot.js v4的补充补丁,缺少在Riot.js v3使用<yield>实现的某些功能。 安装 对于npm用户, $ npm install @creatorqsf/yield 对于纱线使用者 $ yarn add @creatorqsf/yield 用法 在注册防暴...
任何@yield表达式可用于以:yield元数据注释的类,或者可用于所有扩展以:yield(Extend)注释的类的类。 @ :yield class MyClass { // ... } 以下示例显示了yield元数据的两种形式: @ yield return expression ; @...
使用C# yield关键字来提高性能和可读性 C# 中的 yield 关键字可以提高代码的性能和可读性。yield 关键字可以让开发者使用惰性枚举(Lazy Enumeration),从而减少不必要的内存分配和数据处理。下面我们将详细介绍 ...
《AEC-Q002B1:2012 Guidelines for Statistical Yield Analysis》是一份针对半导体行业统计产量分析的重要指导文档。这份文档详尽地阐述了如何在2012年的背景下,运用统计方法对生产过程中的良品率进行评估和优化。...
Python库`ffmpeg_progress_yield`是用于处理多媒体文件的工具,特别是在视频和音频处理方面。它是一个基于Python的接口,能够与FFmpeg命令行工具进行交互,从而为用户提供更方便、更高级别的API来操作多媒体数据。`...
本文实例讲述了Python yield的用法。分享给大家供大家参考,具体如下: yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法。 只是粗略的知道yield可以用来为一个函数返回值塞...
二、yield是一个语法糖,为方便开发者提供的一种方便方法 三、yield返回类型为IEnumerator、IEnumerable、IEnumerator、IEnumerable 四、如果返回类型为IEnumerator编译时会实现一个实现了IEnumerator接口的类 五、...
JavaScript中的`yield`关键字是Generator函数的核心特性,用于在异步操作中实现暂停和恢复执行。Generator函数是ES6引入的一种新的函数类型,它解决了回调地狱的问题,为异步编程提供了一种更优雅的方式。 ...
Unity3D教程:后台资源加载与yield用法2 Unity3D教程:后台资源加载与yield用法2是 Unity3D开发中一个重要的知识点,涉及到后台资源加载和yield的使用。本文将详细介绍yield的核心功能和使用方法,以及在 Unity3D...
yield b #使用yield a, b =b, a + b n = n + 1 N = int (input("请输入生成行数N: ")) def yanghui_triangles(): a = [1] while True: yield a #执行到yield b 时,fab函数返回一个迭代值 a = [sum(i) for i ...
`yield from`语句是Python 3.3引入的新特性,它在异步编程中扮演着重要角色,主要用于简化生成器(generator)的使用,尤其是处理嵌套生成器的情况。 首先,让我们理解`yield from`的基本作用。在Python中,生成器...
本文实例讲述了Python 生成器,迭代,yield关键字,send()传参给yield语句操作。分享给大家供大家参考,具体如下: demo.py(生成器,yield关键字): # 生成器是一个特殊的迭代器。可以用for...in遍历。 # 带有...
C#中Task.Yield的用途深入讲解 Task.Yield是C#中的一个重要概念,它可以帮助开发者更好地管理线程资源,提高程序的性能和可维护性。本文将深入讲解Task.Yield的用途,通过示例代码和详细的解释,帮助读者更好地理解...
### 收益曲线建模(Yield Curve Modeling) #### 知识点一:收益曲线背景 收益曲线(Yield Curve)是一种重要的金融工具,它显示了不同期限的债券收益率与其到期时间之间的关系。通常情况下,收益曲线是按照债券的...
本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解。具体如下: yield关键字用于遍历循环中,yield return用于返回IEnumerable,yield break用于...
初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关键字,然而,带有 yield 的函数执行流程却和普通函数不一样,yield 到底用来做什么,为什么要设计 yield ?本文将由浅入深地讲解 yield 的概念和...