LINUX.ORG.RU

структуры со сложными лайфтаймами

 


0

3

в rustbyexample приведен такой пример:

struct Pair<'a, 'b> {
    one: &'a mut i32,
    two: &'b mut i32,
}

как я понимаю, дословно, лайфтаймы здесь означают, что объект Pair не должна пережить ни *one, ни *two.

чем это тогда отличается от такого кода?

struct Pair<'a> {
    one: &'a mut i32,
    two: &'a mut i32,
}

если ничем, то в каких случаях в структуре имеет смысл объявлять несколько лайфтаймов?

UPD пока пытаюсь намутить контрпример с методами, возвращающими ссылки на разные поля. не очень-то получается

★★★★★

Последнее исправление: MyTrooName (всего исправлений: 2)

//я фиг знает, но предположу например когда ты создаёшь структуру из двух значений прилетевших из космоса, а у них разный лайфтайм, а твой 2й вариант тогда их отвергнет //всё, скор капнул на сегодня

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 2)
Ответ на: комментарий от MyTrooName

А теперь если внутри этого блока произвёл вычисления над pair и захотел создать другую структуру, значение для которой ты берёшь из pair.one, но с длительностью жизни как у внеблоковой one. //Хотя бред какой-то ) //а хотя не бред, ты эту структуру потом посылаешь в какой-нить канал

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 3)

повыкидывав мутабельность, сделал так:

struct Pair<'a,'b> {
    one: &'a i32,
    two: &'b i32,
}

impl<'a,'b,'c> Pair<'a,'b> {
    fn first(&'c self) -> &'a i32 { self.one }
    fn second(&'c self) -> &'b i32 { self.two }
}

fn main() {
    let one: &i32 = &1;

    let first = {
        let two : &i32 = &2;
        let pair = Pair { one: one, two: two };
        pair.first()
    };
}

тут 'a и 'b свести в один не получается как раз из-за того, что ссылка one внутри структуры окажется с тем же временем жизни, что и two, и pair.first() не может вернуть его из блока

я правильно рассуждаю?

MyTrooName ★★★★★
() автор топика
Ответ на: комментарий от Bad_ptr

эту структуру потом посылаешь в какой-нить канал

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

MyTrooName ★★★★★
() автор топика
Ответ на: комментарий от Bad_ptr

тогда то же ограничение накладывается и на массив

MyTrooName ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

s/pair.first()/pair.one/

еще проще. impl не нужен

MyTrooName ★★★★★
() автор топика
Ответ на: комментарий от Bad_ptr

Нет, вроде, выберет наименьший общий.

O02eg ★★★★★
()

Тем, что первую можно параметризовать лишь одним лайфтаймом, а другую — двумя?

quantum-troll ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.