在测试链表是否包含项目时,手动从 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,因此您在循环(如果再执行一次)找到最后一个之前跳出循环元素.

这没有多大意义,所以我认为你的不仅更短而且正确。