0

在咖啡脚本中,我们可以这样做:

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}"
4

3 回答 3

4

你不能那样做,但你可以反转内部循环并将循环结构放在表达式之后:

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}"

可以使用另一个进一步内联thenthen关键字通常相当于换行符并添加一级缩进):

for row in rows then for k,v of row then alert "#{k}: #{v}"

所有这些替代方案都会生成相同的 JS 代码,因此选择一个或另一个不会导致性能下降或类似情况:D

于 2012-06-25T01:50:35.260 回答
0

因为这种复合语法不是 Coffeescript 语言的一部分。编程语言不像人类语言那样流畅。

于 2012-06-25T00:59:39.140 回答
0

当您尝试运行时,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}"
于 2012-06-25T09:20:19.250 回答