Читаем Rust by Example полностью

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

<p id="see_also_20"><strong><a l:href="#see_also_20">See also:</a></strong></p>

functions, enums and Option

<p id="if_let"><strong><a l:href="#if_let">if let</a></strong></p>

For some use cases, when matching enums, match is awkward. For example:

#![allow(unused)]

fn main() {

// Make `optional` of type `Option`

let optional = Some(7);

match optional {

Some(i) => {

println!("This is a really long string and `{:?}`", i);

// ^ Needed 2 indentations just so we could destructure

// `i` from the option.

},

_ => {},

// ^ Required because `match` is exhaustive. Doesn't it seem

// like wasted space?

};

}

if let is cleaner for this use case and in addition allows various failure options to be specified:

fn main() {

// All have type `Option`

let number = Some(7);

let letter: Option = None;

let emoticon: Option = None;

// The `if let` construct reads: "if `let` destructures `number` into

// `Some(i)`, evaluate the block (`{}`).

if let Some(i) = number {

println!("Matched {:?}!", i);

}

// If you need to specify a failure, use an else:

if let Some(i) = letter {

println!("Matched {:?}!", i);

} else {

// Destructure failed. Change to the failure case.

println!("Didn't match a number. Let's go with a letter!");

}

// Provide an altered failing condition.

let i_like_letters = false;

if let Some(i) = emoticon {

println!("Matched {:?}!", i);

// Destructure failed. Evaluate an `else if` condition to see if the

// alternate failure branch should be taken:

} else if i_like_letters {

println!("Didn't match a number. Let's go with a letter!");

} else {

// The condition evaluated false. This branch is the default:

println!("I don't like letters. Let's go with an emoticon :)!");

}

}

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

In the same way, if let can be used to match any enum value:

// Our example enum

enum Foo {

Bar,

Baz,

Qux(u32)

}

fn main() {

// Create example variables

let a = Foo::Bar;

let b = Foo::Baz;

let c = Foo::Qux(100);

// Variable a matches Foo::Bar

if let Foo::Bar = a {

println!("a is foobar");

}

// Variable b does not match Foo::Bar

// So this will print nothing

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

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

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

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

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

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