2017-01-14 2 views
1

Я читал о жизни и понимал, что каждая привязка переменной имеет срок службы. Кажется, однако, что я не могу думать о времени, которое вам действительно нужно будет использовать, учитывая, что компилятор делает большой интерес, чтобы вывести их, когда это необходимо.Когда требуется время жизни?

Книга ржавчины, я прочитал. Я хотел бы привести пример, который просто понять, даже для кого-то вроде меня!

+1

Возможный дубликат [Почему нужны явные времена жизни в Rust?] (Http://stackoverflow.com/questions/31609137/why-are-explicit-lifetimes-needed-in-rust) – ljedrz

+0

да, [этот ответ] (http://stackoverflow.com/a/31609892/119861) в сообщениях Ijedrz есть пример кода, который нуждается в явном времени жизни. – hansaplast

+0

Хотя я полностью согласен с тем, что связанный с вами вопрос похож на мой, ответ @Francis Gagné дал мне действительно хороший ответ, который, на мой взгляд, объясняет это лучше, чем ответы на вопрос, который вы мне связали. Я ценю ваши усилия. –

ответ

2

Мы используем параметров продолжительности жизни в Русте, когда переменные (то есть некоторое время жизни) относятся к другому переменному с другой жизни.

Давайте рассмотрим эти два утверждения:

let i = 42; 
let ref_i = &i; 

Здесь i имеет некоторый срок службы, и ref_i имеет какую-то другую жизнь. Однако тип ref_i кодирует время жизни i (или некоторое его приближение, которое является звуком); тип заимствованного указателя написан &'a T, а 'a - это время жизни референта указателя.

Заимствованные указатели могут ссылаться только на значение, имеющее длину жизни , чем срок службы указателя. Если бы это было не так, то указатель в конечном итоге был бы обманом, то есть он ссылался бы на значение, которое больше не существует. Компилятор автоматически проверяет это для вас (пока вы не пишете код unsafe); это то, что другие языки программирования программирования, такие как C++, не делают. Но для того, чтобы подтвердить это, компилятор должен знать время жизни значения, которое указатель ссылается на; поэтому у нас есть параметры продолжительности жизни в Rust. К счастью, компилятор также может вывести сроки жизни во многих ситуациях, поэтому в этих ситуациях он прозрачен.

По дизайну, ржавчина будет делать только локальный тип вывода. При компиляции функции компилятор не проверяет тело других функций или других типов, чтобы убедиться, что первая функция верна; он смотрит только на свою подпись . Для функций у нас есть правила исключения, которые диктуют, когда мы можем опустить явные параметры жизненного цикла и то, что компилятор будет их выводить. Для structs мы всегда должны указывать их явно, потому что нам почти всегда необходимо сопоставить параметр lifetime в структуре с каким-либо другим элементом (например, параметр lifetime для признака trait impl или тип возвращаемого значения для метода) и из-за того, что компилятор выполняет только локальный тип вывода, нам необходимо явно закодировать эту корреляцию в сигнатуре.

Вот простой пример структуры, которая содержит: заем

struct Wrapper<'a>(&'a str); 

impl<'a> Wrapper<'a> { 
    fn extract(self) -> &'a str { 
     self.0 
    } 
} 

Во-первых, по определению структуры, мы должны ввести параметр времени жизни для среза строки. Затем нам нужно параметризировать impl, потому что Wrapper ожидает параметр времени жизни ('a в impl<'a>определяют параметра пожизненной 'a в Wrapper<'a>используют параметр времени жизни). В поле extract мы можем ссылаться на параметр времени жизни 'a, определенный на impl, так что возвращаемый тип функции соответствует фактическому типу self.0.

Смежные вопросы