Другие срезы
Часть раздела 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]Задание
ЛегкоВы получите три входных данных. Первый ввод — это список чисел, разделенных запятыми. Второй ввод — это два числа, разделенных пробелом, представляющих начальный и конечный индексы для создания среза (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);
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутое управление потоком выполнения
Выражение 'match'Сопоставление нескольких значенийСопоставление диапазоновВыражение 'if let'Циклы как выраженияИтоги — Простой парсер команд4Группировка данных с помощью структур
Что такое структура?Обзор структурДоступ к полям структурыИзменяемые структурыСтруктуры как параметры функцийКортежные структурыИтоги: создание структуры Book7Обработка ошибок с помощью 'Result'
Что такое 'Result'?Использование 'match' с 'Result'is_ok() и is_err()Сокращения: unwrap и expectОператор вопросительного знака '?'Парсинг строк в числаИтоги: функция безопасного деления10Замыкания и анонимные функции
Что такое замыкание?Определение простого замыканияЗамыкания с параметрамиЗахват окруженияИтоги: Простое замыкание-сумматор2Введение в векторы
Что такое вектор?Создание вектораДобавление элементов с помощью pushДоступ к элементам вектораИтерация по векторуИзменяемая итерацияУдаление элементовИтоги — Простой счетчик очков5Пары «ключ-значение» в Hash Map
Что такое Hash Map?Создание Hash MapВставка пар «ключ-значение»Доступ к значениямИтерация по Hash MapОбновление значенияУдаление парыИтоги — Счетчик слов8Проект: Простой инвентарь товаров
Настройка проектаДобавление товараПроверка наличияПродажа товараСобираем всё воедино3Список дел в командной строке
Настройка проектаДобавление задачиПросмотр всех задачУдаление задачиИтоговый код6Обработка отсутствия значения с 'Option'
Что такое 'Option'?Использование 'match' с 'Option'is_some() и is_none()Распаковка 'Option'Метод expectЗначение по умолчанию: unwrap_orИтоги: поиск элемента9Срезы строк и не только
String и &strСоздание срезов строкСрезы как параметры функцийДругие срезыИтоги: поиск первого слова