Интерфейсы с
Мы можем расширить наш макрос 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
Обработка ошибок - это процесс управления возможными сбоями. Например ошибка чтения файла и последующее использование
В Rust есть разные пути работы с ошибками, которые описаны в следующих главах. Они все имеют те или иные отличия и разные варианты использования. Как правило большого пальца:
Явный panic в основном применим для тестирования и работы с невосстановимыми ошибками. При прототипировании его можно использовать, например, когда работаем с ещё не реализованными функциями, но в этом случае лучше использовать более говорящее unimplemented. В тестах panic - разумный способ явного оповещения об ошибке.
Тип Option предназначен для случаев, когда значение не обязательно или когда отсутствие значения не является ошибкой. Например, корневые директории / и C: не имеют родителя. При работе с Option, для прототипирования и случаев, когда мы точно знаем, что значение должно быть, отлично подходит unwrap. Однако более полезен expect, так как он позволяет указать сообщение об ошибке на случай, если что-то пойдёт не так.
Когда есть вероятность, что что-то пойдёт не так и вызывающая сторона должна как-то обработать эту ситуацию, используйте Result. Вы также можете использовать unwrap и expect (пожалуйста, не делайте этого, если вы не пишете тест или не прототипируете).
Для более полного изучения обработки ошибок, обратитесь к соответствующему разделу в книге.
Самый простой механизм обработки ошибок, с которым мы познакомимся – это panic. Он печатает сообщение с ошибкой, начинает процедуру раскрутки стека и, чаще всего, завершает программу. В данном примере мы явно вызываем panic в случае ошибки:
fn give_princess(gift: &str) {
// Принцесса ненавидит змей, поэтому нам нужно остановиться, если она не одобрит!
if gift == "змея" { panic!("AAAaaaaa!!!!"); }
println!("Я люблю тебя, {}!!!!!", gift);
}
fn main() {
give_princess("плюшевый мишка");
give_princess("змея");
}