- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于ES6生成器,为什么this blog post的作者说:
来自:http://davidwalsh.name/es6-generators
"The first next(..) call, we don't send in anything. Why? Because there's no yield expression to receive what we pass in."
第一个 it.next()
不是调用 (yield (x + 1))
吗?
function *foo(x) {
var y = 2 * (yield (x + 1));
var z = yield (y / 3);
return (x + y + z);
}
var it = foo( 5 );
// note: not sending anything into `next()` here
console.log( it.next() ); // { value:6, done:false }
console.log( it.next( 12 ) ); // { value:8, done:false }
console.log( it.next( 13 ) ); // { value:42, done:true }
You can see that we can still pass in parameters (x in our example) with the initial foo( 5 ) iterator-instantiation call, just like with normal functions.
The first next(..) call, we don't send in anything. Why? Because there's no yield expression to receive what we pass in.
最佳答案
第一个 it.next()
对应于 yield(x + 1)
,结果如预期的那样为 6。下一次调用 it.next(12)
时的 12 将第一个 yield 的值设置为 12,因此 y
设置为它的两倍,即 24 和迭代器结果值 (y/3)
,即 8。对 it.next(13)
的最终调用将第二个 yield 的值设置为 13,即设置为 z
,并接收 return
的值,即 5 + 24 + 13。
当然,由于语法原因,它有点令人困惑
z = yield(y / 3)
这看起来像是将与 y/3
相关的值分配给 z
。事实并非如此。 y/3
是作为迭代器值产生的值,而 z
被分配给由以下 it.next()
调用,完全不同的东西!省略括号并将其写为
var y = 2 * yield x + 1;
var z = yield y / 3;
请记住,yield
是一个语句,而不是函数调用。
至于您提到的错误,例如在 traceur 中它是“将值发送给新生生成器”。当您考虑它时,这是有道理的。作为参数发送到 it.next()
的值成为生成器中最近 yield 的值。在第一次调用 it.next()
时,生成器中 没有最新的 yield ,因此没有任何东西可以接受传递的值,因此出现错误。
不要混淆将参数传递给生成器(在您的情况下为 x
),它仅提供一种配置或初始化生成器的方法,将参数传递给 it.next()
,作为生成器中最近的 yield
的值。
考虑如何编写等效的手动生成器可能会有所帮助(简化为仅返回下一个值而不是 {value, done}
,并在生成器结束时抛出气体):
function foo(x) {
var y, z, step = 0;
return function next(val) {
switch (step++) {
case 0: return x + 1; break;
case 1: y = 2 * val; return y / 3; break;
case 2: z = val; return x + y + z; break;
default: throw "generator finished";
}
};
}
然后:
iterator = foo(5);
iterator(); // 6
iterator(12); // 8
iterator(13); // 42
关于javascript - ES6 生成器 - 第一个 next() 没有 yield 表达式的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26695346/
我正在用 yacc/bison 编写一个简单的计算器。 表达式的语法看起来有点像这样: expr : NUM | expr '+' expr { $$ = $1 + $3; } | expr '-'
我开始学习 lambda 表达式,并在以下情况下遇到了以下语句: interface MyNumber { double getValue(); } MyNumber number; nu
这两个 Linq 查询有什么区别: var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault(); // vs. va
如果我们查看 draft C++ standard 5.1.2 Lambda 表达式 段 2 说(强调我的 future ): The evaluation of a lambda-expressio
我使用的是 Mule 4.2.2 运行时、studio 7.5.1 和 Oracle JDK 1.8.0_251。 我在 java 代码中使用 Lambda 表达式,该表达式由 java Invoke
我是 XPath 的新手。我有网页的html源 http://london.craigslist.co.uk/com/1233708939.html 现在我想从上面的页面中提取以下数据 完整日期 电子
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我将如何编写一个 Cron 表达式以在每天上午 8 点和下午 3:30 触发?我了解如何创建每天触发一次的表达式,而不是在多个设定时间触发。提前致谢 最佳答案 你应该只使用两行。 0 8 * * *
这个问题已经有答案了: What do 3 dots next to a parameter type mean in Java? (9 个回答) varargs and the '...' argu
我是 python 新手,在阅读 BeautifulSoup 教程时,我不明白这个表达式“[x for x in titles if x.findChildren()][:-1]”我不明白?你能解释一
(?:) 这是一个有效的 ruby 正则表达式,谁能告诉我它是什么意思? 谢谢 最佳答案 正如其他人所说,它被用作正则表达式的非捕获语法,但是,它也是正则表达式之外的有效 ruby 语法。 在
这个问题在这里已经有了答案: Why does ++[[]][+[]]+[+[]] return the string "10"? (10 个答案) 关闭 8 年前。 谁能帮我处理这个 JavaSc
这个问题在这里已经有了答案: What is the "-->" operator in C++? (29 个答案) Java: Prefix/postfix of increment/decrem
这个问题在这里已经有了答案: List comprehension vs. lambda + filter (16 个答案) 关闭 10 个月前。 我不确定我是否需要 lambda 或其他东西。但是,
C 中的 assert() 函数工作原理对我来说就像一片黑暗的森林。根据这里的答案https://stackoverflow.com/a/1571360 ,您可以使用以下构造将自定义消息输出到您的断言
在this页,John Barnes 写道: If the conditional expression is the argument of a type conversion then effec
我必须创建一个调度程序,它必须每周从第一天上午 9 点到第二天晚上 11 点 59 分运行 2 天(星期四和星期五)。为此,我需要提供一个 cron 表达式。 0-0 0-0 9-23 ? * THU
我正在尝试编写一个 Linq 表达式来检查派生类中的属性,但该列表由来自基类的成员组成。下面的示例代码。以“var list”开头的 Process 方法的第二行无法编译,但我不确定应该使用什么语法来
此 sed 表达式将输入字符串转换为两行输出字符串。两条输出行中的每一行都由输入的子串组成。第一行需要转换成大写: s:random_stuff\(choice1\|choice2\){\([^}]*
我正在使用 Quartz.Net 在我的应用程序中安排我的工作。我只是想知道是否可以为以下场景构建 CRON 表达式: Every second between 2:15AM and 5:20AM 最
我是一名优秀的程序员,十分优秀!