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

Интерфейсы с переменным числом параметров (вариативные интерфейсы) принимают произвольное число аргументов. Например, println! может принимать произвольное число аргументов, как определено в формате строки.

Мы можем расширить наш макрос calculate! из предыдущей главы, чтобы он имел вариативный интерфейс:

macro_rules! calculate {

// Шаблон для единичного `eval`

(eval $e:expr) => {{

{

let val: usize = $e; // Заставим быть переменную целым числом.

println!("{} = {}", stringify!{$e}, val);

}

}};

// Рекурсивно декомпозируем несколько `eval`

(eval $e:expr, $(eval $es:expr),+) => {{

calculate! { eval $e }

calculate! { $(eval $es),+ }

}};

}

fn main() {

calculate! { // Смотри, мама! Вариативный `calculate!`!

eval 1 + 2,

eval 3 + 4,

eval (2 * 3) + 1

}

}

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Вывод:

1 + 2 = 3

3 + 4 = 7

(2 * 3) + 1 = 7

<p id="Обработка_ошибок"><strong><a l:href="#Обработка_ошибок">Обработка ошибок</a></strong></p>

Обработка ошибок - это процесс управления возможными сбоями. Например ошибка чтения файла и последующее использование плохих данных могут прояснить проблематику. Уведомление и явное управление этими ошибками сохранит оставшуюся часть программы от различных неожиданностей.

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

Явный panic в основном применим для тестирования и работы с невосстановимыми ошибками. При прототипировании его можно использовать, например, когда работаем с ещё не реализованными функциями, но в этом случае лучше использовать более говорящее unimplemented. В тестах panic - разумный способ явного оповещения об ошибке.

Тип Option предназначен для случаев, когда значение не обязательно или когда отсутствие значения не является ошибкой. Например, корневые директории / и C: не имеют родителя. При работе с Option, для прототипирования и случаев, когда мы точно знаем, что значение должно быть, отлично подходит unwrap. Однако более полезен expect, так как он позволяет указать сообщение об ошибке на случай, если что-то пойдёт не так.

Когда есть вероятность, что что-то пойдёт не так и вызывающая сторона должна как-то обработать эту ситуацию, используйте Result. Вы также можете использовать unwrap и expect (пожалуйста, не делайте этого, если вы не пишете тест или не прототипируете).

Для более полного изучения обработки ошибок, обратитесь к соответствующему разделу в книге.

<p id="panic"><strong><a l:href="#panic">panic</a></strong></p>

Самый простой механизм обработки ошибок, с которым мы познакомимся – это panic. Он печатает сообщение с ошибкой, начинает процедуру раскрутки стека и, чаще всего, завершает программу. В данном примере мы явно вызываем panic в случае ошибки:

fn give_princess(gift: &str) {

// Принцесса ненавидит змей, поэтому нам нужно остановиться, если она не одобрит!

if gift == "змея" { panic!("AAAaaaaa!!!!"); }

println!("Я люблю тебя, {}!!!!!", gift);

}

fn main() {

give_princess("плюшевый мишка");

give_princess("змея");

}

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

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

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

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

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

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