我有以下Ruby代码:
# func1 generates a sequence of items derived from x
# func2 does something with the items generated by func1
def test(x, func1, func2)
func1.call(x) do | y |
func2.call(y)
end
end
func1 = lambda do | x |
for i in 1 .. 5
yield x * i
end
end
func2 = lambda do | y |
puts y
end
test(2, func1, func2) # Should print '2', '4', '6', '8', and '10'
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用.
test.rb:11: no block given (LocalJumpError) …Run Code Online (Sandbox Code Playgroud) 这是我的发电机:
def gen():
state = [None]
for i in range(5):
state[0] = i
yield state
Run Code Online (Sandbox Code Playgroud)
当我调用它时,这是输出:
>>> list(gen())
[[4], [4], [4], [4], [4]]
Run Code Online (Sandbox Code Playgroud)
如果我再次执行该语句,我得到的东西[4](由于[[0], [1], [2], [3], [4]]调用),但所有的相同的值[4].
我有以下代码:
<?php
function generator() {
yield 'First value';
for ($i = 1; $i <= 3; $i++) {
yield $i;
}
}
$gen = generator();
$first = $gen->current();
echo $first . '<br/>';
//$gen->next();
foreach ($gen as $value) {
echo $value . '<br/>';
}
Run Code Online (Sandbox Code Playgroud)
输出:
First value
First value
1
2
3
Run Code Online (Sandbox Code Playgroud)
我需要“第一个价值”才能产生一次。如果我取消注释$ gen-> next()行,则会发生致命错误:
致命错误:消息为“无法倒带已运行的生成器”的未捕获异常“ Exception”
我该如何解决?
我目前正在尝试在Unity的上下文中理解IEnumerator和Coroutine,并且对"yield return null"执行的内容不太自信.目前我认为它基本上暂停并等待下一帧,并且在下一帧中它将再次执行while语句.
如果我省略"yield return null",它似乎会立即移动到目的地或者"跳过很多帧".所以我想我的问题是在这个while循环中这个"yield return null"函数是如何实现的,为什么有必要这样做.
void Start () {
StartCoroutine(Move());
}
IEnumerator Move(){
while (a > 0.5f){
... (moves object up/down)
yield return null; // <---------
}
yield return new WaitForSeconds(0.5f);
.... (moves object up/down)
StartCoroutine(Move());
}
Run Code Online (Sandbox Code Playgroud) 我正在读一本关于scala编程的书(Scala中的Programming),我对yield语法有一个疑问.
根据这本书,yield的语法可以表示为:for子句yield body
但是当我尝试运行下面的脚本时,编译器会抱怨getName的参数太多了
def scalaFiles =
for (
file <- filesHere
if file.isFile
if file.getName.endsWith(".scala")
) yield file.getName {
// isn't this supposed to be the body part?
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是yield语法的"body"部分是什么,如何使用它?
我想使用rspec测试迭代器.在我看来,唯一可能的产量匹配器是yield_successive_args(根据https://www.relishapp.com/rspec/rspec-expectations/v/3-0/docs/built-in-matchers/yield-matchers).其他匹配器仅用于单一屈服.
但是yield_successive_args如果屈服是以指定的其他顺序而失败.
是否有任何方法或很好的解决方法来测试以任何顺序产生的迭代器?
类似于以下内容:
expect { |b| array.each(&b) }.to yield_multiple_args_in_any_order(1, 2, 3)
Run Code Online (Sandbox Code Playgroud) 我使用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) 编辑:这里有一个类似的问题涉及迭代器重置。然而,下面接受的答案解决了嵌套迭代器的实际问题,并处理了一个容易错过的问题,即嵌套迭代器不会重置。
有没有办法在 python 中迭代迭代器两次?
在下面的示例代码中,我可以看到第二次迭代与第一次迭代在同一对象上运行,因此产生了奇怪的结果。将此与下面的 C# 进行对比,得到我想要的结果。
有什么办法可以做我想做的事。我想知道是否可以复制迭代器或“检索”它来自的函数,但也许有一种更简单的方法。(我知道我可以在下面的玩具示例中调用MyIter()两次,但如果我不知道迭代器来自哪里并且不是我想要的,那么这是没有用的!)。
def MyIter():
yield 1;
yield 2;
yield 3;
yield 4;
def PrintCombos(x):
for a in x:
for b in x:
print(a,"-",b);
PrintCombos(MyIter());
Run Code Online (Sandbox Code Playgroud)
给出
1 - 2
1 - 3
1 - 4
Run Code Online (Sandbox Code Playgroud)
对比:
static IEnumerable MyIter()
{
yield return 1;
yield return 2;
yield return 3;
yield return 4;
}
static void PrintCombos(IEnumerable x)
{
foreach (var a in x)
foreach (var b in x)
Console.WriteLine(a + "-" …Run Code Online (Sandbox Code Playgroud) 我一直在将Ruby代码转换为Python代码,现在我坚持使用包含以下内容的函数yield:
def three_print():
yield
yield
yield
Run Code Online (Sandbox Code Playgroud)
我想调用该函数并告诉它打印"Hello"三次,因为这三个yield语句.由于函数不接受任何参数,我得到一个错误.你能告诉我最简单的方法吗?谢谢.