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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

1

elision implicitly annotates lifetimes and so is different.

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

generics and closures

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

Ignoring elision, function signatures with lifetimes have a few constraints:

   • any reference must have an annotated lifetime.

   • any reference being returned must have the same lifetime as an input or be static.

Additionally, note that returning references without input is banned if it would result in returning references to invalid data. The following example shows off some valid forms of functions with lifetimes:

// One input reference with lifetime `'a` which must live

// at least as long as the function.

fn print_one<'a>(x: &'a i32) {

println!("`print_one`: x is {}", x);

}

// Mutable references are possible with lifetimes as well.

fn add_one<'a>(x: &'a mut i32) {

*x += 1;

}

// Multiple elements with different lifetimes. In this case, it

// would be fine for both to have the same lifetime `'a`, but

// in more complex cases, different lifetimes may be required.

fn print_multi<'a, 'b>(x: &'a i32, y: &'b i32) {

println!("`print_multi`: x is {}, y is {}", x, y);

}

// Returning references that have been passed in is acceptable.

// However, the correct lifetime must be returned.

fn pass_x<'a, 'b>(x: &'a i32, _: &'b i32) -> &'a i32 { x }

//fn invalid_output<'a>() -> &'a String { &String::from("foo") }

// The above is invalid: `'a` must live longer than the function.

// Here, `&String::from("foo")` would create a `String`, followed by a

// reference. Then the data is dropped upon exiting the scope, leaving

// a reference to invalid data to be returned.

fn main() {

let x = 7;

let y = 9;

print_one(&x);

print_multi(&x, &y);

let z = pass_x(&x, &y);

print_one(z);

let mut t = 3;

add_one(&mut t);

print_one(&t);

}

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

functions

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

Methods are annotated similarly to functions:

struct Owner(i32);

impl Owner {

// Annotate lifetimes as in a standalone function.

fn add_one<'a>(&'a mut self) { self.0 += 1; }

fn print<'a>(&'a self) {

println!("`print`: {}", self.0);

}

}

fn main() {

let mut owner = Owner(18);

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

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

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

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

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

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