问题标签 [yield]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
14 回答
148069 浏览

javascript - JavaScript 中的 yield 关键字是什么?

我听说过 JavaScript 中有一个“yield”关键字,但我发现关于它的文档很差。有人可以解释一下(或推荐一个解释)它的用法和用途的网站吗?

0 投票
4 回答
1246 浏览

ruby - Ruby 等效于 C# 的 'yield' 关键字,或者,在不预分配内存的情况下创建序列

在 C# 中,您可以执行以下操作:

这将返回一个包含 1000 万个整数的可枚举序列,而无需在内存中分配该长度的集合。

有没有办法在 Ruby 中做同样的事情?我要处理的具体示例是将矩形数组展平为要枚举的值序列。返回值不必是Arrayor Set,而是某种只能按顺序迭代/枚举的序列,而不是按索引。因此,整个序列不需要同时在内存中分配。在 .NET 中,这是IEnumerableIEnumerable<T>.

对 Ruby 世界中使用的术语进行任何澄清都会有所帮助,因为我更熟悉 .NET 术语。

编辑

也许我最初的问题还不够清楚——我认为yield在 C# 和 Ruby 中具有非常不同含义的事实是造成混淆的原因。

我不想要一个需要我的方法使用块的解决方案。我想要一个具有实际返回值的解决方案。返回值允许对序列进行方便的处理(过滤、投影、连接、压缩等)。

这是我如何使用的一个简单示例get_items

In C#, any method returning IEnumerable that uses a yield return causes the compiler to generate a finite state machine behind the scenes that caters for this behaviour. I suspect something similar could be achieved using Ruby's continuations, but I haven't seen an example and am not quite clear myself on how this would be done.

It does indeed seem possible that I might use Enumerable to achieve this. A simple solution would be to us an Array (which includes module Enumerable), but I do not want to create an intermediate collection with N items in memory when it's possible to just provide them lazily and avoid any memory spike at all.

If this still doesn't make sense, then consider the above code example. get_items returns an enumeration, upon which select is called. What is passed to select is an instance that knows how to provide the next item in the sequence whenever it is needed. Importantly, the whole collection of items hasn't been calculated yet. Only when select needs an item will it ask for it, and the latent code in get_items will kick into action and provide it. This laziness carries along the chain, such that select only draws the next item from the sequence when map asks for it. As such, a long chain of operations can be performed on one data item at a time. In fact, code structured in this way can even process an infinite sequence of values without any kinds of memory errors.

So, this kind of laziness is easily coded in C#, and I don't know how to do it in Ruby.

I hope that's clearer (I'll try to avoid writing questions at 3AM in future.)

0 投票
7 回答
11327 浏览

javascript - Javascript 检查产量支持

我阅读了 JavaScript 中的 yield 关键字,我需要在我的项目中使用它。我读到这个关键字是从某个版本的 JS 开始实现的,所以我认为旧浏览器不支持它(对吗?)。

有没有办法检查是否支持 yield 关键字?或者至少有办法检查 JS 的版本是否大于或等于实现该关键字的版本(1.7)?

0 投票
1 回答
3199 浏览

python - Python 中的 cx_Oracle、生成器和线程

当连接对象被不同的线程使用时,cx_Oracle 游标的行为是什么?生成器将如何影响这种行为?具体来说...

编辑:原始示例函数不正确;子函数返回了一个生成器,yield没有直接在循环中使用。这澄清了何时finally执行(之后return执行),但仍然没有回答如果另一个线程开始使用创建游标的连接对象是否可以使用游标。它实际上似乎(至少在 python 2.4 中)try...finallyyield导致语法错误。

Get()是一个被多个线程调用的函数。连接是使用threaded=False参数创建的。

我在想...

  1. cursor如果线程 2 出现并使用相同的连接对象,线程 1 的对象是否仍然可用?如果没有,可能会发生什么?

我看到的行为是 cx_Oracle 中谈论协议错误的异常,然后是段错误。

0 投票
4 回答
498 浏览

python - python中是否存在“太多的yield语句”之类的东西?

如果列出目录并读取其中的文件,与返回目录中所有文件的列表相比,yield 的性能在什么时候开始恶化?

在这里,我假设一个有足够的 RAM 来返回(可能很大)列表。

PS 我在注释中内联代码时遇到问题,所以我会在这里放一些例子。

在幕后,对 glob 的两个调用都使用 os.listdir ,所以看起来它们在性能方面是等效的。但是这个 Python 文档似乎暗示 glob.iglob 更快。

0 投票
2 回答
3768 浏览

python - 使用 finally 子句的 try 块中不允许 python 2.4 的 yield 的解决方法

我被困在 python2.4 上,所以我不能将 finally 子句与生成器或yield. 有没有办法解决这个问题?

我在 python 2.4 中找不到任何关于如何解决这个限制的提及,而且我不是我想到的解决方法的忠实粉丝(主要涉及__del__并试图确保它在合理的时间内运行)是不是很吸引人。

0 投票
1 回答
372 浏览

c# - PLINQ 延迟执行

考虑到延迟执行,我试图了解并行性如何使用 PLINQ 工作。这是一个简单的例子。

使用 LINQ,我希望执行达到“收据”值并返回 true,而不执行其余值的查询。

如果我们并行执行此操作,“relief”的评估可能在“receipt”的结果返回之前就开始了。但是一旦查询知道“receipt”会产生一个真实的结果,其他线程会立即让步吗?

就我而言,这很重要,因为“任何”测试可能非常昂贵,我想释放处理器以执行其他任务。

0 投票
4 回答
23864 浏览

c# - C#:foreach 内的 yield return 失败 - body 不能是迭代器块

考虑一下这段混淆的代码。目的是通过匿名构造函数和yield return它动态创建一个新对象。目标是避免仅仅为了简单而维护本地集合return

不幸的是,这段代码产生了一个异常:

错误 28 'Foo.BuildComputerAssets()' 的主体不能是迭代器块,因为 'System.Collections.Generic.List' 不是迭代器接口类型

问题

  • 这个错误信息是什么意思?
  • 如何避免此错误并yield return正确使用?
0 投票
1 回答
17398 浏览

ruby - 在 Ruby 中将多个代码块作为参数传递

我有一个采用代码块的方法。

我这样称呼它:

opportunity { @some_array.empty? }

但是我如何传递不止一个代码块,以便我可以使用两次 yield,如下所示:

和:

我知道这个例子可以在没有产量的情况下完成,但这只是为了说明。

0 投票
4 回答
51415 浏览

python - 如何以 Python 方式从列表中生成所有值?

假设我有一个我不想返回但从中产生值的列表。最pythonic的方法是什么?

这就是我的意思。多亏了一些非惰性计算,我已经计算了 list ['a', 'b', 'c', 'd'],但是我通过项目的代码使用了惰性计算,所以我想从我的函数中产生值而不是返回整个列表。

我目前写如下:

但这对我来说并不像pythonic。