Имеет ли смысл прерывание вручную из цикла for при тестировании, если связанный список содержит элемент? - PullRequest
0 голосов
/ 13 ноября 2018

Следуя базовому руководству, я столкнулся с этой функцией:

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;
}

Вроде нормально работает, но может есть что-то, что я пропустил?Это просто ненужные накладные расходы, которые автор учебника сделал по ошибке?

1 Ответ

0 голосов
/ 13 ноября 2018

Как написано в оригинальной «учебной» версии, похоже, что он не рассматривает последний элемент. Рассмотрим список длины 2, где второй элемент - это тот, который вы ищете.

После первого сравнения ch становится 1. Теперь оно равно длине списка минус 1, поэтому вы выходите из цикла как раз перед тем, как цикл (если выполняется еще раз) найдет последний элемент.

Это не имеет особого смысла, поэтому я пришел к выводу, что ваша не только короче, но и правильна.

...