在咖啡脚本中,我们可以这样做:
rows = [
{a: 1}
{b: 2}
]
for row in rows
for k,v of row
alert "#{k}: #{v}"
那么为什么我们不能这样做呢?:
for k,v of row for row in rows
alert "#{k}: #{v}"
在咖啡脚本中,我们可以这样做:
rows = [
{a: 1}
{b: 2}
]
for row in rows
for k,v of row
alert "#{k}: #{v}"
那么为什么我们不能这样做呢?:
for k,v of row for row in rows
alert "#{k}: #{v}"
你不能那样做,但你可以反转内部循环并将循环结构放在表达式之后:
for row in rows
alert "#{k}: #{v}" for k,v of row
而且,由于该内循环也是一个表达式,您也可以以相同的方式反转外循环:D
alert "#{k}: #{v}" for k,v of row for row in rows
与您尝试编写的内容最相似的可能是:
for row in rows then for k,v of row
alert "#{k}: #{v}"
可以使用另一个进一步内联then
(then
关键字通常相当于换行符并添加一级缩进):
for row in rows then for k,v of row then alert "#{k}: #{v}"
所有这些替代方案都会生成相同的 JS 代码,因此选择一个或另一个不会导致性能下降或类似情况:D
因为这种复合语法不是 Coffeescript 语言的一部分。编程语言不像人类语言那样流畅。
当您尝试运行时,for k,v of row for row in rows
您会在第 1 行收到Parse 错误: Unexpected 'FOR'。
那是因为你放东西的那一刻for row in rows
,它一定是一种表达,而for k,v of row
不是一种。您可以通过使前缀循环成为实际表达式来验证这一点:
row for k,v of row for row in rows
这编译。因此,与使用后缀形式进行迭代的方式相同rows
,您必须对内部形式进行后缀:
alert "#{k}: #{v}" for k,v of row for row in rows
要实现您想要的分隔,您需要使用then
替换换行符,而不是使用后缀表达式:
for row in rows then for k,v of row
alert "#{k}: #{v}"