Menu
Coddy logo textTech

Другие срезы

Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 57 из 66.

Хотя срезы строк очень полезны, использование срезов не ограничивается только строками. Концепция срезов в Rust распространяется на любую последовательность элементов, что делает их мощным инструментом для работы с коллекциями без получения владения.

Вы можете создавать срезы из массивов и векторов, используя тот же синтаксис, который вы изучили для строк. Например, если у вас есть массив чисел, вы можете создать срез, который ссылается на его часть или на весь массив целиком:

let numbers = [1, 2, 3, 4, 5];
let slice: &[i32] = &numbers[1..4]; // Это дает нам [2, 3, 4]
let full_slice: &[i32] = &numbers;  // Это ссылается на весь массив

Тот же принцип работает и с векторами. Вы можете создавать срезы из векторов, чтобы работать с частями данных без их перемещения или копирования:

let mut vec = vec![10, 20, 30, 40];
let vec_slice: &[i32] = &vec[0..2]; // Это дает нам [10, 20]
challenge icon

Задание

Легко

Вы получите три входных данных. Первый ввод — это список чисел, разделенных запятыми. Второй ввод — это два числа, разделенных пробелом, представляющих начальный и конечный индексы для создания среза (slice). Третий ввод — это одно число, представляющее индекс для доступа к элементу внутри среза.

Создайте вектор из чисел, разделенных запятыми, затем создайте срез, используя указанный диапазон. Получите доступ к элементу по заданному индексу из среза и выведите его на печать.

Требования:

  • Прочитайте первый ввод (числа, разделенные запятыми) и удалите лишние пробелы
  • Разделите строку по запятым и преобразуйте каждое число в тип i32
  • Создайте вектор из этих чисел
  • Прочитайте второй ввод (два числа, разделенных пробелом) и удалите лишние пробелы
  • Разделите второй ввод по пробелу, чтобы получить начальный и конечный индексы
  • Преобразуйте оба индекса в тип usize
  • Создайте срез из вектора, используя синтаксис диапазона &vec[start..end]
  • Прочитайте третий ввод (индекс для доступа) и удалите лишние пробелы
  • Преобразуйте индекс в тип usize
  • Получите доступ к элементу по указанному индексу из среза
  • Выведите полученный элемент на печать

Ввод:

  • Первая строка: Числа, разделенные запятыми (например, 10,20,30,40,50)
  • Вторая строка: Два числа, разделенных пробелом (например, 1 4)
  • Третья строка: Число индекса (например, 2)

Вывод:

  • Элемент по указанному индексу из среза

Шпаргалка

Срезы можно создавать из массивов и векторов, а не только из строк. Они ссылаются на часть коллекции, не забирая владение.

Создание срезов из массивов:

let numbers = [1, 2, 3, 4, 5];
let slice: &[i32] = &numbers[1..4]; // Ссылается на [2, 3, 4]
let full_slice: &[i32] = &numbers;  // Ссылается на весь массив

Создание срезов из векторов:

let mut vec = vec![10, 20, 30, 40];
let vec_slice: &[i32] = &vec[0..2]; // Ссылается на [10, 20]

Срезы используют тот же синтаксис диапазонов, что и срезы строк, и позволяют работать с частями данных без их перемещения или копирования.

Попробуйте сами

use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    let mut lines = stdin.lock().lines();
    
    // Чтение первого ввода (числа, разделенные запятыми)
    let first_input = lines.next().unwrap().unwrap();
    
    // Чтение второго ввода (начальный и конечный индексы)
    let second_input = lines.next().unwrap().unwrap();
    
    // Чтение третьего ввода (индекс для доступа)
    let third_input = lines.next().unwrap().unwrap();
    
    // TODO: Напишите свой код ниже
    // Разобрать числа, разделенные запятыми, и создать вектор
    // Разобрать начальный и конечный индексы
    // Создать срез (slice) из вектора
    // Получить доступ к элементу по указанному индексу из среза
    
    // Вывести результат
    // println!("{}", result);
}
quiz iconПроверьте себя

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

Все уроки раздела Logic & Flow