我很迷惑。下面的代码给我一个indexoutofbound错误。但是,如果我要删除启用$result = mysql_query("SELECT background FROM " . $shadowless_background_table . " WHERE id = 1");
if (mysql_num_rows($result)>0){
$fetchedColum = mysql_result($result, 0, 'COLUMN_NAME');
}
的斜杠,它将起作用。我真的不明白为什么会发生这种情况,并希望得到解释。
for(j <- i until tmpArray.length)
答案 0 :(得分:3)
当您“迭代”它时,您正在修改数组。
您实际上是在预先计算的0 until tmpArray.length
范围内进行迭代。在某些时候,你减少了数组的长度(或者,我假设,因为我在remove
类上找不到Array
。但是,当你创建范围时,它仍然会继续迭代到最后一个索引。
当您取消注释内部for
块时,您将重新计算外部for
的每个步骤的范围。恰好如果j
,i >= tmpArray.length
范围内的任何内容都没有任何内容。所以它无意中防止了这种失败。
这是非常C风格(命令式)代码。看起来你要做的就是从数组中删除一些项目。这就是filter
的用途。
val result = tmpArray.filter { d =>
if(date.getValue != null && d != date.getValue) false else true
}
通过将匿名函数传递给result
,可以创建 new 数组(tmpArray.filter
)。它会将数组中的每个项目传递给您的“谓词”,如果它返回true
,它会将该项目保留在result
中,否则会省略它。
你应该注意我避免说“循环”。 Scala的for
不是用于制作循环。它实际上是调用foreach
和map
等方法的语法糖。谷歌“scala for comprehensions”了解更多细节。
如果您坚持使用索引和循环变量创建C风格循环,则需要使用while
,以便每次都检查i < tmpArray.length
。