Не могу переписать код на Rust

Есть код на Python:

def read_int():
    return map(int, input().split())

def solve(nums):
    trainings = []
    chest = 0
    biceps = 0
    back = 0
    
    for i in range(0, len(nums), 3):
        trainings.append(nums[i:i + 3])
    for training in trainings:
        for i in range(len(training)):
            if i == 0:
                chest += training[i]
            elif i == 1:
                biceps += training[i]
            else:
                back += training[i]
    if max(chest, biceps, back) == chest:
        return "chest"
    elif max(chest, biceps, back) == biceps:
        return "biceps"
    else:
        return "back"

def main():
    n = int(input())
    print(solve(list(read_int())))

main()

Пытаюсь переписать его на Rust:

use std::io;

fn read_vec() -> Vec<i32> {
    let mut input = String::new();
    io::stdin().read_line(&mut input).unwrap();
    input
        .trim()
        .split_whitespace()
        .map(|x| x.parse::<i32>().unwrap())
        .collect()
}

fn solve(nums: Vec<i32>) -> String {
    let mut trainings = Vec::new();
    let mut chest = 0;
    let mut biceps = 0;
    let mut back = 0;

    for i in (0..nums.len()).step_by(3) {
        trainings.push(&nums[i..i + 3]);
    }

    for training in trainings {
        for (i, value) in training.iter().enumerate() {
            if i == 0 {
                chest += *value;
            } else if i == 1 {
                biceps += *value;
            } else {
                back += *value;
            }
        }
    }

    let max_value = chest.max(biceps).max(back);

    if max_value == chest {
        return "chest".to_string();
    } else if max_value == biceps {
        return "biceps".to_string();
    } else {
        return "back".to_string();
    }
}

fn main() {
    let mut n = String::new();
    io::stdin().read_line(&mut n).expect("msg");
    let num: i32 = n.trim().parse().expect("msg");
    let nums = read_vec();
    let r = solve(nums);
    println!("{}", r);
}

Получаю ошибку:

range end index 3 out of range for slice of length 2
при входных данных:

2<br>
2 8

Функция read_vec читает строку и превращает в вектор:

 for i in range(0, len(nums), 3):
        trainings.append(nums[i:i + 3])

Этот код создаёт массивы по 3 элемента из возможных, например:

3 3 2 7 9 6 8

Будут разделены так:

[[3, 3, 2], [7, 9, 7], [8]]

Здесь проблема в этом участке кода:

for i in (0..nums.len()).step_by(3) {
    trainings.push(&nums[i..i + 3]);
}

Если я введу длину вектора, кратную 3, ошибок не будет.

Например:

5 1 10

Но в python это работает так:

for i in range(0, len(nums), 3):
    trainings.append(nums[i:i + 3])

Ответы (1 шт):

Автор решения: vessd

Если ты хочешь разделить вектор по 3 элемента, то можно использовать метод chunks:

let vec = vec![3, 3, 2, 7, 9, 6, 8];
let mut trainings = Vec::new();
for c in vec.chunks(3) {
    trainings.push(c);
}
[[3, 3, 2], [7, 9, 6], [8]]
→ Ссылка