仍然试图找到我在实际情况下使用"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)
在这里.似乎更直截了当..
我非常喜欢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只有方面break和return它总是被执行i.
如果不可能以for...else这种方式使用,那么最好的方法是什么才能使print语句只在没有产生的情况下执行?
我希望以一种易于理解的形式了解该声明的所有内容yield.
我已经阅读了关于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中,这是IEnumerable和IEnumerable<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询问它时才从序列中抽取下一个项目.这样,可以一次对一个数据项执行长链操作.实际上,以这种方式构造的代码甚至可以处理无限 …
我正在将一个网站从Rails 2(最新)迁移到Rails 3(beta2).
使用Ruby 1.9.1p378和Ruby 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方将不会被处理的轨道或可能红宝石.
感谢您的投入和时间!
可能重复:
解释了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中有什么作用?对于产量,生成器和迭代,它是一个非常好的通用指南,即使我没有找到它对我的具体情况的答案:)
我试图使用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得到正确的逆转?
谢谢
使用PHP> = 5.5如果我们有一个产生值的方法,那么计算这些值的最佳方法是什么?
我期待的是能够将Generator转换为数组并计算它,但它会返回一个空数组.Count()也不起作用,因为尽管不是空的,但报告为空.
我对此感到困惑.如果你不需要计算发电机的产量,那么这是一个很好的功能,否则我没有看到它的重点.有一种方法可以检测生成器是否为空,这是通过使用key()方法,如果它返回NULL,则无法产生或者已经迭代了生成器,这意味着当前指针为空.
我使用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) 是否有使用终极版,传奇的任何优势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)
哪一个更好?为什么?
yield ×10
generator ×3
c# ×2
ecmascript-6 ×2
for-loop ×2
iterator ×2
javascript ×2
python ×2
ruby ×2
.net ×1
ienumerable ×1
iteration ×1
nightmare ×1
node.js ×1
php ×1
python-2.7 ×1
redux-saga ×1
scala ×1
sequences ×1
string ×1
swap ×1
syntax ×1