标签: yield

C#中的纤维:它们比迭代器更快,并且让人们使用它们?

所以我正在和一位同事聊聊有关光纤的问题,在2003年发表这篇论文,描述了使用Fiber API在C#中实现协同程序.

本文的实现Yield是针对.NET 1.1的,因此它早yield return于.NET 2.0中出现的语法.

乍一看,它确实看起来这里的实现可能更快,并且可以很好地扩展到多个CPU.

有人用过吗?

c# yield coroutine fiber

8
推荐指数
2
解决办法
4120
查看次数

在块/ lambda中产生麻烦

我有以下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)

ruby lambda yield block

8
推荐指数
1
解决办法
3042
查看次数

为什么这个python生成器每次都返回相同的值?

这是我的发电机:

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].

python yield generator

8
推荐指数
2
解决办法
1718
查看次数

PHP生成器产生第一个值,然后遍历其余值

我有以下代码:

<?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”

我该如何解决?

php yield generator

8
推荐指数
2
解决办法
4428
查看次数

Unity - IEnumerator的yield返回null

我目前正在尝试在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)

c# ienumerator yield coroutine unity-game-engine

8
推荐指数
2
解决办法
3万
查看次数

scala - yield语法

我正在读一本关于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"部分是什么,如何使用它?

scala yield

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

以任何顺序匹配多个收益率

我想使用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)

ruby iterator rspec yield ruby-on-rails

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

使用没有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
查看次数

Python——迭代一个迭代器两次

编辑:这里有一个类似的问题涉及迭代器重置。然而,下面接受的答案解决了嵌套迭代器的实际问题,并处理了一个容易错过的问题,即嵌套迭代器不会重置。

有没有办法在 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)

python iterator for-loop yield generator

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

Python yield(从Ruby迁移):如何在没有参数的情况下编写函数,并且只能使用yield进行打印?

我一直在将Ruby代码转换为Python代码,现在我坚持使用包含以下内容的函数yield:

def three_print():
    yield
    yield
    yield
Run Code Online (Sandbox Code Playgroud)

我想调用该函数并告诉它打印"Hello"三次,因为这三个yield语句.由于函数不接受任何参数,我得到一个错误.你能告诉我最简单的方法吗?谢谢.

ruby python yield generator proc

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