在从 JS 编辑器 (Tern) 阅读代码时,我遇到了 for 循环的各种用途,如下面的代码片段所示:
代码片段 1 @ lines 463-468 :
for (;;) {
/* some code */
}
代码片段 2 @ lines 97-100
for (var i = 0; ; ++i) {
/* some code */
}
同样,我也遇到过一个带有空体的 for 循环,例如:
for (var p; p; p = someValue) /* empty body */ ;
我试图了解代码执行流程中发生了什么。
我的看法是,对于片段 1 中的代码,for 循环没有条件,因此它可能会无限循环?对于代码段 2 中的代码,i 会无限递增吗?对于第三个,循环继续直到 p 被赋值为 false?
这些是我心中的想法,但我不确定。请协助。
最佳答案
首先,您的所有断言都是正确的。
让我们深入了解为什么会发生这种情况。
如果我们仔细看看 the language specification我们可以看到在 for 循环中发生了以下情况:
IterationStatement : for ( ExpressionNoIn(opt) ; Expression(opt) ; Expression(opt)) Statement
我将在其余答案中处理这些陈述和定义。
现在让我们回顾一下案例。
for(;;)之一发生以下情况:ExpressionNoIn 不存在,因此该子句不调用任何内容(如子句 1 所述)。
第二个表达式不在,所以我们不返回调用(如第 3 条所述)。
第三个表达式为空,因此没有执行“递增”(如条款 3.f 所述)。
所以它基本上会像您预测的那样无休止地重复(直到用 break 中断或从中返回,或从中抛出以及通常导致突然完成的任何事情)。 (如条款 e 和 d 告诉我们的那样)。
for (var i = 0; ; ++i)发生以下情况:ExpressionNoIn 存在,因此我们对其求值,并为其分配获取值(如第 1 条所述)。我们不分配它。
因为这里没有第二个表达式,所以我们不断地重复。所以我们继续,直到发生突然执行或发生中断。更具体地说,这是定义 here .
我们递增 i在子句 f 状态下的每次迭代中。
for (var p; p; p = someValue) /* empty body */ ;发生以下情况:这作为 for 循环求值。语句确实是空的,但 for 循环并不关心。唯一的区别是 for 循环没有返回值。基本上它是一个完整且合法的 for 循环。 ;只是一个空洞的陈述。当您想在实际循环中运行没有内容的 for 循环时,它很有用。您有时会在特征检测中看到这一点。当您想要找到最小值 n 时,这也很有用。这样... .
你是正确的,因为它一直运行到值为 false,或者更准确地说是 calling ToBoolean on it produces。 false .如第 3.a.ii 条所述。
如您所见,这些都在规范中并且定义明确:)
在第一个片段中,使用 a break clause 执行流量控制. if (eol >= pos || eol < 0) break; (他们检查行尾,这可以在更传统的 for 循环中完成)。
在第二个片段中,他们再次使用 break 进行流量控制:
if (!definitions.hasOwnProperty(uniq)) { name = uniq; break; }
他们再次将它放在 for 循环内的 break 语句中。
第三个片段脱离上下文,但假设我们想要(简单的例子)找到大于 10 的第一个数字(或第 10 个 div 元素,或字符串的出现 - 你得到这个想法)。我们可以这样做:
for(var i=0;i<>
并得到第一个大于 10 的数字。
关于javascript - 更好地理解 JavaScript for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18059360/
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
“输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
我是Ruby的新手,有些闭包逻辑让我感到困惑。考虑这段代码:array=[]foriin(1..5)array[5,5,5,5,5]这对我来说很有意义,因为i被绑定(bind)在循环之外,所以每次循环都会捕获相同的变量。使用每个block可以解决这个问题对我来说也很有意义:array=[](1..5).each{|i|array[1,2,3,4,5]...因为现在每次通过时都单独声明i。但现在我迷路了:为什么我不能通过引入一个中间变量来修复它?array=[]foriin1..5j=iarray[5,5,5,5,5]因为j每次循环都是新的,我认为每次循环都会捕获不同的变量。例如,这绝对
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
假设我有一个没有特定顺序的随机数数组。假设这些是参加马拉松比赛的人的ID#,他们按照完成的顺序添加到数组中,例如:race1=[8,102,67,58,91,16,27]race2=[51,31,7,15,99,58,22]这是一个简化且有些做作的示例,但我认为它传达了基本思想。现在有几个问题:首先,我如何获得特定条目之前和之后的ID?假设我正在查看运行者58,我想知道谁在他之前和之后完成了比赛。race1,runner58:previousfinisher=67,nextfinisher=91race2,runner58:previousfinisher=99,nextfinishe
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan