Coffeescript 中的循环与操作

发布于 2025-01-01 17:46:16 字数 131 浏览 2 评论 0原文

如何将此循环转换为咖啡脚本?

for (var j = world.m_jointList; j; j = j.m_next) {
        drawJoint(j, context);
}

How can I convert this loop to coffeescript?

for (var j = world.m_jointList; j; j = j.m_next) {
        drawJoint(j, context);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

无人接听 2025-01-08 17:46:16
while j = (unless j? then first else j.next)
  do stuff

但一般来说,仅将初始化代码作为单独的语句编写 for 循环有什么问题,例如 j=first;而 j 那么...; j=j.next

编辑:
或者,可能:

while j = j?.next ? first
  do stuff
while j = (unless j? then first else j.next)
  do stuff

But generally, what's wrong with just writing for loops with the initialize code as a separate statement, e.g. j=first; while j then ...; j=j.next?

edit:
Or, possibly:

while j = j?.next ? first
  do stuff
煮茶煮酒煮时光 2025-01-08 17:46:16

原文中发生了什么:

Javascript 有 复合 for 循环。括号内的声明具有三个表达式:for(x; y; z){...}

  • x 在循环之前运行一次
  • y 是一个条件,在每次迭代之前进行测试。如果为 false,循环将
  • 在每次迭代后停止 z 运行一次。

在此代码中,您设置 j = world.m_jointList,它是链接列表中的第一项。 for 循环的中间部分正在检查真实性 of j;,并且在每次迭代之后,j 被设置为 j.m_next,它是指向链中下一个对象的指针。当 j 计算结果为 false(在本例中可能是 undefined)时,它结束。

为了形象化,world 可能看起来像这样:

world = {
   m_jointList: {
      value: 'head',
      m_next: world.foo1
   },
   foo1: {
      value: 'foo',
      m_next: world.foo2
   },
   foo2: {
      value: 'foo',
      m_next: world.tail
   },
   tail: {
      value: 'foo'
   }
}

实际上,列表中的项目可能不作为 world 的属性存在,但这会起到相同的作用。请注意,最后一个对象中的 m_next 未定义。有时,尾部的占位符值将用于指示链的末尾。

名称 m_jointList 在这里也有点误导,因为它实际上并不包含列表,只包含列表的第一个元素。

这应该在 CoffeeScript 中完成:

j = world.m_jointList
while j then drawJoint(j, context); j = j.m_next

这将是 javascript 中 do...while 的一个很好的用途:

var j = world.m_jointList
do { drawJoint(j, context) } while (j = j.m_next)

What's happening in the original:

Javascript has compound for loops. The declaration inside the parenthesis has three expressions: for(x; y; z){...}.

  • x runs once before the loop
  • y is a condition, tested before each iteration. If it's false the loop will stop
  • z runs once after every iteration

In this code, you set j = world.m_jointList, which is the first item in the linked list. The middle part of the for loop is checking for thruthiness of j;, and after each iteration j is set to j.m_next, which is a pointer to the next object in the chain. It ends when j evaluates to false (probably undefined in this case).

To visualize that, world could look like this:

world = {
   m_jointList: {
      value: 'head',
      m_next: world.foo1
   },
   foo1: {
      value: 'foo',
      m_next: world.foo2
   },
   foo2: {
      value: 'foo',
      m_next: world.tail
   },
   tail: {
      value: 'foo'
   }
}

In reality the items in the list probably don't exist as properties of world, but this would work the same. Notice that m_next is undefined in the last object. Sometimes a placeholder value for the tail will be used indicating the end of the chain.

The name m_jointList is also a bit misleading here because it doesn't actually contain the list, just the first element of it.

This should do it in coffeescript:

j = world.m_jointList
while j then drawJoint(j, context); j = j.m_next

And that would've been a good use of do...while in javascript:

var j = world.m_jointList
do { drawJoint(j, context) } while (j = j.m_next)
时光暖心i 2025-01-08 17:46:16

这是最好的:

j = world.m_jointList
loop
    break if not j
    drawJoint j,context
    j=j.m_next

它只是描述了 for 循环的含义。

this is the best:

j = world.m_jointList
loop
    break if not j
    drawJoint j,context
    j=j.m_next

it just describes what the for loop mean.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文