Читаем Rust на примерах полностью

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Option и Iterator реализуют свою часть функций высшего порядка..

<p id="Расходящиеся_функции"><strong><a l:href="#Расходящиеся_функции">Расходящиеся функции</a></strong></p>

Расходящиеся функции никогда не возвращают результат. Они помечены с помощью !, который является пустым типом.

#![allow(unused)]

fn main() {

fn foo() -> ! {

panic!("Этот вызов никогда не вернёт управление.");

}

}

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

Например, эта функция имеет возвращаемое значение, хотя о нём нет информации.

fn some_fn() {

()

}

fn main() {

let a: () = some_fn();

println!("Эта функция возвращает управление и вы можете увидеть эту строку.")

}

В отличие от этой функции, которая никогда не вернёт элемент управления вызывающей стороне.

#![feature(never_type)]

fn main() {

let x: ! = panic!("Этот вызов никогда не вернёт управление.");

println!("вы никогда не увидете эту строку!");

}

Хотя это может показаться абстрактным понятием, на самом деле это очень полезно и может пригодится. Главное преимущество этого типа в том, что его можно привести к любому другому типу и поэтому используется в местах, где требуется точный тип, например в ветвях match. Это позволяет нам писать такой код:

fn main() {

fn sum_odd_numbers(up_to: u32) -> u32 {

let mut acc = 0;

for i in 0..up_to {

// Обратите внимание, что возвращаемый тип этого выражения match должен быть u32

// потому что такой тип в переменной "addition" .

let addition: u32 = match i%2 == 1 {

// Переменная "i" типа u32, что совершенно нормально.

true => i,

// С другой стороны выражение "continue" не возвращает

// u32, но это тоже нормально, потому что это тип не возвращающий управление,

// не нарушает требования к типу выражения match.

false => continue,

};

acc += addition;

}

acc

}

println!("Сумма нечётных чисел до 9 (исключая): {}", sum_odd_numbers(9));

}

Это также возвращаемый тип функций, которые содержат вечный цикл (например, loop {}), как сетевые серверы или функции, завершающие процесс (например, exit()).

<p id="Модули"><strong><a l:href="#Модули">Модули</a></strong></p>

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

Модуль - это набор элементов, таких как: функции, структуры, типажи, блоки реализации (impl) и даже другие модули.

<p id="Видимость"><strong><a l:href="#Видимость">Видимость</a></strong></p>

По умолчанию, элементы модуля являются приватными, но это можно изменить добавив модификатор pub. Только публичные элементы модуля могут быть доступны за пределами его области видимости.

// Модуль по имени `my_mod`

mod my_mod {

// Все элементы модуля по умолчанию являются приватными.

fn private_function() {

println!("вызвана `my_mod::private_function()`");

}

Перейти на страницу:

Похожие книги

Компьютерные сети. 6-е изд.
Компьютерные сети. 6-е изд.

Перед вами шестое издание самой авторитетной книги по современным сетевым технологиям, написанное признанным экспертом Эндрю Таненбаумом в соавторстве со специалистом компании Google Дэвидом Уэзероллом и профессором Чикагского университета Ником Фимстером. Первая версия этого классического труда появилась на свет в далеком 1980 году, и с тех пор каждое издание книги неизменно становилось бестселлером. В книге последовательно изложены основные концепции, определяющие современное состояние компьютерных сетей и тенденции их развития. Авторы подробно объясняют устройство и принципы работы аппаратного и программного обеспечения, рассматривают все аспекты и уровни организации сетей — от физического до прикладного. Изложение теоретических принципов дополняется яркими, показательными примерами функционирования интернета и компьютерных сетей различного типа. Большое внимание уделяется сетевой безопасности. Шестое издание полностью переработано с учетом изменений, произошедших в сфере сетевых технологий за последние годы, и, в частности, освещает такие технологии, как DOCSIS, 4G и 5G, беспроводные сети стандарта 802.11ax, 100-гигабитные сети Ethernet, интернет вещей, современные транспортные протоколы CUBIC TCP, QUIC и BBR, программно-конфигурируемые сети и многое другое.

Дэвид Уэзеролл , Ник Фимстер , Эндрю Таненбаум

Учебные пособия, самоучители