生成函数中的委托收益率(收益率星,收益率*)

时间:2013-07-05 14:57:38

标签: javascript ecmascript-6

ECMAScript 6应该带来生成器函数和迭代器。生成器函数(具有function*语法)返回迭代器。迭代器有一个next方法,当重复调用时,它执行生成器函数的主体,在每个yield运算符处重复暂停和恢复执行。

ECMAScript 6 wiki on generators还引入了“委托收益率”yield*运算符,如下所示:

  

yield*运算符委托给另一台生成器。这为组合生成器提供了便利的机制。

“委托另一台发电机”是什么意思?如何使用yield*“方便地组合生成器”?

[您可以使用--harmony-generators标志在Node v0.11.3中使用生成器。]

3 个答案:

答案 0 :(得分:40)

委托给另一个生成器意味着当前生成器自动停止生成值,而是生成另一个生成器生成的值,直到它耗尽它为止。然后它会恢复生成自己的值(如果有的话)。

例如,如果secondGenerator()生成的数字从1015,而firstGenerator()会产生从15的数字,但代表是在生成secondGenerator()2firstGenerator()生成的值将为:

1, 2, 10, 11, 12, 13, 14, 15, 3, 4, 5

function* firstGenerator() {
    yield 1;
    yield 2;
    // Delegate to second generator
    yield* secondGenerator();
    yield 3;
    yield 4;
    yield 5;
}

function* secondGenerator() {
    yield 10;
    yield 11;
    yield 12;
    yield 13;
    yield 14;
    yield 15;
}

console.log(Array.from(firstGenerator()));

答案 1 :(得分:2)

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    int PICK_IMAGE_REQUEST = 100;
    Bundle extras = null;
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK) {
        extras = data.getExtras();
    }
    if (extras != null) {
        Bitmap photo = extras.getParcelable("data");
        ImageView profilePhoto = (ImageView) findViewById(R.id.profileImageView);
        profilePhoto.setImageBitmap(photo);
    }

结果是

function *gimme1to2_10to15_3to5() {
    var ten = gimme10to15();
    yield 1; yield 2;
    for (var i = 10; i <= 20; i++)
        yield *ten;
    yield 3; yield 4; yield 5;
    }

function *gimme10to15() {
    for (var i = 10; i <= 15; i++)
        var x = yield i;
    }

let gen = gimme1to2_10to15_3to5();

var ar = [];
for (var i = 0; i < 12; i++)
    {
    var r = gen.next();
    ar [i] = r.value + (r.done ? "!" : "..");
    }
console.log (ar.join (", "));

注释

  1. yield * 的函数会询问内部生成器的11个值,但只接收它应该的10..15。多余的收益* 电话无效。

  2. 内置生成器的已完成值对其调用者返回的已完成没有影响。

  3. 输出结尾显示 undefined!,因为测试循环写入超出所需数量的值,以显示生成器的 done = true

  4. 此输出来自ES6测试场Babel,上面显示的语义应视为截至2016年2月5日的临时。

答案 2 :(得分:2)

委托收益率不必委托给另一个生成器 ,而是委托给任何迭代器,所以第一个答案有点不确定。考虑这个简单的例子:

`
function *someGenerator() {
    yield 0;
    yield [1,2,3]
    yield* [1,2,3] 
}

for (v of someGenerator()) {
    console.log(v);
}

`

生成器本身内没有其他函数 - 但yield委托给Array Object Iterator的迭代器; - )