Size: a a a

Rust — русскоговорящее сообществo

2020 March 19

В

Вафель in Rust — русскоговорящее сообществo
Mikail Bagishov
У итератора сигнатура fn next(&mut self) -> T
А тут fn next<'a>(&'a mut self) -> T + 'a
-> T<'a>*
источник

В

Вафель in Rust — русскоговорящее сообществo
Mikail Bagishov
Я не в первый раз слышу, чтобы кто-то хотел такой вид итераторов. Но не помню библиотеку, которая объявляла бы такой трейт.
Но примерную сигнатуру я тебе показал.
Проблема в том что для такого трейта нужен GAT
источник

M

Marat in Rust — русскоговорящее сообществo
Berkus Decker
а где он жил тогда, ты ж его лайфтайм указываешь
Ну внутри B и жил в поле, это поле переприсваивалось новому объекту A, создаваемому в next()
источник

M

Marat in Rust — русскоговорящее сообществo
В итоге решил через 2 функции, одна fn gen_a(&mut self) -> (), а вторая fn get_a(&self) -> &A, вызывал последовательно, но выглядит не очень ок
источник

BD

Berkus Decker in Rust — русскоговорящее сообществo
а тебе обязательно по ссылке? если можно просто поле скопировать это решит вообще все проблемы и даст тебе нормальный итератор
источник

M

Marat in Rust — русскоговорящее сообществo
Berkus Decker
а тебе обязательно по ссылке? если можно просто поле скопировать это решит вообще все проблемы и даст тебе нормальный итератор
Там тяжелый объект, каждый раз копировать или клонировать - не ок
источник

BD

Berkus Decker in Rust — русскоговорящее сообществo
Marat
Там тяжелый объект, каждый раз копировать или клонировать - не ок
тогда не пойдет, жаль
источник

AT

Alexander Tchitchigin in Rust — русскоговорящее сообществo
Marat
Там тяжелый объект, каждый раз копировать или клонировать - не ок
What about Rc?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Вафель
Мне кажется мы друг друга не правильно поняли...

Дело не в функции (оно и так всё вынесено) а в вопросе — чтобы превратить slice: &[T] в &[T; N] нужно чтобы было верно slice.len() >= N, или всё же slice.len() == N?

Ну и да, вместо
unsafe fn to_lesser<'a, T: Sized, U: Sized>(reference: &'a T) -> &'a U {
   &*(reference as *const T as *const U)
}

Можно просто написать

unsafe fn ref_transmute<T, U>(reference: &T) -> &U {
   mem::transmute::<&T, &U>(reference)
}
Слайсы всегда непрерывны в памяти, так что просто .len() >= N
источник

MS

Mikola Summer Duck in Rust — русскоговорящее сообществo
Вафель
Мне кажется мы друг друга не правильно поняли...

Дело не в функции (оно и так всё вынесено) а в вопросе — чтобы превратить slice: &[T] в &[T; N] нужно чтобы было верно slice.len() >= N, или всё же slice.len() == N?

Ну и да, вместо
unsafe fn to_lesser<'a, T: Sized, U: Sized>(reference: &'a T) -> &'a U {
   &*(reference as *const T as *const U)
}

Можно просто написать

unsafe fn ref_transmute<T, U>(reference: &T) -> &U {
   mem::transmute::<&T, &U>(reference)
}
Я бы спросил на раст интерналс насчёт твоей магии на самом деле. Или в black-magic растового дискорда. Потому что так-то выглядит что будет работать но хз что взбредёт в голову компилятору на тему предоставляемых гарантий.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Mikola Summer Duck
Я бы спросил на раст интерналс насчёт твоей магии на самом деле. Или в black-magic растового дискорда. Потому что так-то выглядит что будет работать но хз что взбредёт в голову компилятору на тему предоставляемых гарантий.
Слайс - просто область в памяти. &[T] - просто указатель + длина. Какие ты ещё гарантии хочешь?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Открываешь код core либы и смотришь union Repr и FatPtr.
источник

ML

Mike Lubinets in Rust — русскоговорящее сообществo
Вафель
Мне кажется мы друг друга не правильно поняли...

Дело не в функции (оно и так всё вынесено) а в вопросе — чтобы превратить slice: &[T] в &[T; N] нужно чтобы было верно slice.len() >= N, или всё же slice.len() == N?

Ну и да, вместо
unsafe fn to_lesser<'a, T: Sized, U: Sized>(reference: &'a T) -> &'a U {
   &*(reference as *const T as *const U)
}

Можно просто написать

unsafe fn ref_transmute<T, U>(reference: &T) -> &U {
   mem::transmute::<&T, &U>(reference)
}
источник

Э

Эрик in Rust — русскоговорящее сообществo
Проблемы появиться могут только если ты кастуешь &[T] в &[U; N].
источник

M

Marat in Rust — русскоговорящее сообществo
Alexander Tchitchigin
What about Rc?
тащить в хип, то что в других языках можно на уровне стека решить?
источник

r

red75prime in Rust — русскоговорящее сообществo
Да, для шареных слайсов должно быть нормально. Ссылка на массив - это в общем-то слайс но с размером в типе, а не в толстом указателе
источник

MS

Mikola Summer Duck in Rust — русскоговорящее сообществo
Эрик
Слайс - просто область в памяти. &[T] - просто указатель + длина. Какие ты ещё гарантии хочешь?
Ну, например, законно ли таким макаром превращать &'mut слайс в &mut массив? Два &mut массива?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Mikola Summer Duck
Ну, например, законно ли таким макаром превращать &'mut слайс в &mut массив? Два &mut массива?
Открываешь std доки и читаешь .split_mut() метод к слайсам.
источник

AT

Alexander Tchitchigin in Rust — русскоговорящее сообществo
Marat
тащить в хип, то что в других языках можно на уровне стека решить?
А в чём принципиальная разница хипа и стека?
источник

r

red75prime in Rust — русскоговорящее сообществo
Mikola Summer Duck
Ну, например, законно ли таким макаром превращать &'mut слайс в &mut массив? Два &mut массива?
Если результирующие ссылки на массив не пересекаются, то да. split_mut() такое делает, но со слайсами
источник