在测试链表是否包含项目时,手动从 for 循环提前中断是否有意义?
Does manually breaking early from a for loop make sense when testing if a linked list contains an item?
在学习基础教程时,我遇到了这个函数:
use std::collections::LinkedList;
// ...
pub fn contains(&self, x: i32, y: i32) -> bool {
let mut ch = 0;
let list: &LinkedList<Block> = &self.body;
for block in list {
if block.x == x && block.y == y {
return true;
}
ch += 1;
if ch == list.len() - 1 {
break;
}
}
return false;
}
很明显,我可以去掉整个 if ch == list.len() - 1
部分,然后这样写:
pub fn contains(&self, x: i32, y: i32) -> bool {
for block in &self.body {
if block.x == x && block.y == y {
return true;
}
}
return false;
}
它似乎工作正常,但也许我错过了什么?教程的作者错误地制作了一个不必要的开销吗?
原'tutorial'版写的,好像没有看最后一个元素。考虑一个长度为 2 的列表,其中第二个元素是您要查找的元素。
第一次比较后,ch
变为 1。它现在等于列表长度减 1,因此您在循环(如果再执行一次)找到最后一个之前跳出循环元素.
这没有多大意义,所以我认为你的不仅更短而且正确。
在学习基础教程时,我遇到了这个函数:
use std::collections::LinkedList;
// ...
pub fn contains(&self, x: i32, y: i32) -> bool {
let mut ch = 0;
let list: &LinkedList<Block> = &self.body;
for block in list {
if block.x == x && block.y == y {
return true;
}
ch += 1;
if ch == list.len() - 1 {
break;
}
}
return false;
}
很明显,我可以去掉整个 if ch == list.len() - 1
部分,然后这样写:
pub fn contains(&self, x: i32, y: i32) -> bool {
for block in &self.body {
if block.x == x && block.y == y {
return true;
}
}
return false;
}
它似乎工作正常,但也许我错过了什么?教程的作者错误地制作了一个不必要的开销吗?
原'tutorial'版写的,好像没有看最后一个元素。考虑一个长度为 2 的列表,其中第二个元素是您要查找的元素。
第一次比较后,ch
变为 1。它现在等于列表长度减 1,因此您在循环(如果再执行一次)找到最后一个之前跳出循环元素.
这没有多大意义,所以我认为你的不仅更短而且正确。