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

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

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

3
streletss 13 Ноя 2018 в 01:35

1 ответ

Лучший ответ

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

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

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

2
dave 13 Ноя 2018 в 00:55