标签: yield

收益率关键字增值?

仍然试图找到我在实际情况下使用"yield"关键字的位置.

我在这个主题上看到了这个主题

C#中使用的yield关键字是什么?

但是在接受的答案中,他们将此作为一个例子,其中某人正在迭代Integers()

public IEnumerable<int> Integers()
{
yield return 1;
yield return 2;
yield return 4;
yield return 8;
yield return 16;
yield return 16777216;
}
Run Code Online (Sandbox Code Playgroud)

但为什么不用

list<int>
Run Code Online (Sandbox Code Playgroud)

在这里.似乎更直截了当..

c# ienumerable iterator yield

7
推荐指数
2
解决办法
1930
查看次数

在Python生成器中使用for ... else

我非常喜欢Python的... else语法 - 令人惊讶的是它的适用频率,以及它如何有效地简化代码.

但是,我还没有想出一个在生成器中使用它的好方法,例如:

def iterate(i):
    for value in i:
        yield value
    else:
        print 'i is empty'
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我希望print只有在i空的情况下才能执行该语句.然而,无论长度如何,else只有方面breakreturn它总是被执行i.

如果不可能以for...else这种方式使用,那么最好的方法是什么才能使print语句只在没有产生的情况下执行?

python syntax for-loop yield generator

7
推荐指数
3
解决办法
5457
查看次数

屈服声明实施

我希望以一种易于理解的形式了解该声明的所有内容yield.

我已经阅读了关于yield实现迭代器模式时的语句及其简易性.但是,大部分都非常干燥.我想深入研究微软如何处理收益率.

另外,你什么时候使用收益率突破?

.net c# iterator yield

7
推荐指数
4
解决办法
3584
查看次数

Ruby相当于C#的'yield'关键字,或者,在没有预先分配内存的情况下创建序列

在C#中,你可以这样做:

public IEnumerable<T> GetItems<T>()
{
    for (int i=0; i<10000000; i++) {
        yield return i;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑

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

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

这是一个我可能会如何使用的简单示例get_items:

things = obj.get_items.select { |i| !i.thing.nil? }.map { |i| i.thing }
Run Code Online (Sandbox Code Playgroud)

在C#中,任何返回IEnumerable使用a的方法yield return都会导致编译器在幕后生成满足此行为的有限状态机.我怀疑使用Ruby的延续可以实现类似的东西,但我还没有看到一个例子,我自己也不清楚如何做到这一点.

我确实有可能用它Enumerable来实现这一目标.一个简单的解决方案是我们Array(包括模块Enumerable),但我不想在内存中创建一个包含N个项目的中间集合,只要它们可以懒得提供它们并且完全避免任何内存峰值.

如果这仍然没有意义,那么请考虑上面的代码示例. get_items返回一个枚举,在其select上调用.传递给的select是一个知道如何在需要时提供序列中的下一个项目的实例.重要的是,尚未计算整个项目集.只有当select需要一个项目时它才会要求它,并且潜在的代码get_items将开始行动并提供它.这种懒惰带有链条,这样select只有在map询问它时才从序列中抽取下一个项目.这样,可以一次对一个数据项执行长链操作.实际上,以这种方式构造的代码甚至可以处理无限 …

ruby yield sequences

7
推荐指数
2
解决办法
1198
查看次数

Rails 3 - yield return或callback不会在视图中调用<%= yield(:sidebar)|| 渲染('shared/sidebar')%>

我正在将一个网站从Rails 2(最新)迁移到Rails 3(beta2).
使用Ruby 1.9.1p378Ruby 1.9.2dev进行测试(2010-04-05 trunk 27225)

陷入困境,我不知道哪一部分会运作良好.怀疑yield是问题,但不确切知道.

在我的布局文件中,我经常使用以下技术:

app/views/layouts/application.html.erb:

<%= yield(:sidebar) || render('shared/sidebar') %>
Run Code Online (Sandbox Code Playgroud)

例如,部分外观如下:

app/views/shared/_sidebar.html.erb:

<p>Default sidebar Content. Bla Bla</p>
Run Code Online (Sandbox Code Playgroud)

现在是关键部分的时候了!
在任何视图中,我想创建一个content_for块(可选).这可能包含一些HTML等示例,如下所示.如果设置了此块,则内部的pice HTML应该呈现application.html.erb.
如果没有,Rails应该shared/_sidebar.html.erb在右侧渲染Partial .

app/views/books/index.html.erb:

<% content_for :sidebar do %>
    <strong>You have to read REWORK, a book from 37signals!</strong>
<% end %>
Run Code Online (Sandbox Code Playgroud)

所以你有了这个主意.希望.这种技术在任何Rails 2.x应用程序中都运行良好.
现在,在Rails 3 (beta2)中,只有yieldPart正在运行.

|| render('shared/sidebar')
Run Code Online (Sandbox Code Playgroud)

or方将不会被处理的轨道或可能红宝石.

感谢您的投入和时间!

ruby yield ruby-on-rails ruby-on-rails-3

7
推荐指数
1
解决办法
3659
查看次数

屈服在python 2.7中有什么作用?

可能重复:
解释了Python yield关键字

好吧,我可能很难说这个问题,但这就是我的情况.

我在Python 2.7中有这行代码,我试图理解:

yield (padding_zeros + number_string).encode("ascii")
Run Code Online (Sandbox Code Playgroud)

在这行代码中,padding_zeros是一个变量数为0的字符串,是一个字符串number_string形式的数字,可以是0到10000之间的任何数字.

我非常有信心.encode("ascii")将yield的输出转换为ascii.

我完全在海上讲的是它的yield (padding_zeros + number_string)作用.

我知道它启动了一个生成器,但我花了很多时间在线搜索并阅读语法,但我仍然无法弄清楚生成器实际上了什么.这是我第一次看python没有帮助(我的最终目标是将此代码转换为C#).

那么,基本上,请有人向我解释这行代码的作用是什么?它只是将两个字符串加在一起还是做了一些更复杂的事情?

对于进一步的上下文,这是该行代码出现的块:

for current_length in range(4, max_length + 1):
    for i in range(0, pow(10, current_length)):
        number_string = str(i)
        padding_zeros = "0" * (current_length - len(number_string))
        yield (padding_zeros + number_string).encode("ascii")
Run Code Online (Sandbox Code Playgroud)

(max_length正如它听起来的那样 - 一个表示某事物最大长度的数字)

提前感谢任何和所有的答案(即使他们告诉我不要这样一个毛躁的菜鸟):)

编辑:非常感谢你的答案 - 即使我只选择一个作为最好的答案,他们都非常有帮助.还要感谢评论 - 正如其中一些人指出的那样,"yield"关键字在Python中有什么作用?对于产量,生成器和迭代,它是一个非常好的通用指南,即使我没有找到它对我的具体情况的答案:)

python string yield generator python-2.7

7
推荐指数
1
解决办法
1万
查看次数

使用for和yield scala交换数组值

我试图使用for和yield交换我的数组中的每对值,到目前为止我非常不成功.我试过的内容如下:

val a = Array(1,2,3,4,5) //What I want is Array(2,1,4,3,5)

for(i<-0 until (a.length-1,2),r<- Array(i+1,i)) yield r
Run Code Online (Sandbox Code Playgroud)

上面给出的片段返回向量2,1,4,3(省略了5)

有人可以指出我在这里做错了什么以及如何使用for和yield得到正确的逆转?

谢谢

iteration swap for-loop scala yield

7
推荐指数
3
解决办法
6007
查看次数

PHP - 如何计算生成器的产量

使用PHP> = 5.5如果我们有一个产生值的方法,那么计算这些值的最佳方法是什么?

我期待的是能够将Generator转换为数组并计算它,但它会返回一个空数组.Count()也不起作用,因为尽管不是空的,但报告为空.

我对此感到困惑.如果你不需要计算发电机的产量,那么这是一个很好的功能,否则我没有看到它的重点.有一种方法可以检测生成器是否为空,这是通过使用key()方法,如果它返回NULL,则无法产生或者已经迭代了生成器,这意味着当前指针为空.

php yield generator

7
推荐指数
3
解决办法
6222
查看次数

使用没有ES6语法和产量的Nightmare.js

我使用nightmare.js构建了一个简单的节点脚本来抓取网站

var Nightmare = require('nightmare');
var vo = require('vo');

vo(run)(function(err, result) {
    if (err) throw err;
});

function *run() {
    var x = Date.now();
    var nightmare = Nightmare();
    var html = yield nightmare
    .goto('http://google.com')
    .evaluate(function() {
        return document.getElementsByTagName('html')[0].innerHTML;
    });

    console.log("done in " + (Date.now()-x) + "ms");
    console.log("result", html);

    yield nightmare.end();
}
Run Code Online (Sandbox Code Playgroud)

我想在使用旧版本节点的环境中运行它,该节点不支持ES6功能.如果没有"yield"关键字,github页面上没有关于如何执行此操作的示例.

我确实找到了一个没有ES6语法的使用示例:Webscraping with nightmare

我这样写的:

var night = new Nightmare()
.goto('http://www.google.com')
.evaluate(function () {
  return document.getElementsByTagName('html')[0].innerHTML;
},function (html) {
   console.log("result", html);
  }
)
.run(function (err, nightmare) {
  if …
Run Code Online (Sandbox Code Playgroud)

javascript yield node.js ecmascript-6 nightmare

7
推荐指数
1
解决办法
4408
查看次数

yield []&yield all() - ES6/redux-saga之间的差异

是否有使用终极版,传奇的任何优势yield all([])ES6的内置yield []

为了并行运行多个操作,redux-saga建议:

const result = yield all([
  call(fetchData),
  put(FETCH_DATA_STARTED),
]);
Run Code Online (Sandbox Code Playgroud)

但是没有all()方法可以实现同样的目的:

const result = yield [
  call(fetchData),
  put(FETCH_DATA_STARTED),
];
Run Code Online (Sandbox Code Playgroud)

哪一个更好?为什么?

javascript yield ecmascript-6 redux-saga

7
推荐指数
1
解决办法
5631
查看次数