Size: a a a

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

2020 March 24

Э

Эрик in Rust — русскоговорящее сообществo
Нормально я всё сделал.
источник

Э

Эрик in Rust — русскоговорящее сообществo
transmute<&'a T, &'static T>(s.as_str())
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
вижу трансмут лайфтаймов & говорю что написана хрень
источник

Э

Эрик in Rust — русскоговорящее сообществo
Да, спасибо, конечно я буду всю стрингу копировать, вместо ссылки на неё.
источник

В

Вафель in Rust — русскоговорящее сообществo
Эрик
transmute<&'a T, &'static T>(s.as_str())
А есть полный код?
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Эрик
Да, спасибо, конечно я буду всю стрингу копировать, вместо ссылки на неё.
1. мне тяжело представить когда это реально нужно
2. без трансмута обратно в старый лайфтайм это инста-уб
источник

Э

Эрик in Rust — русскоговорящее сообществo
Alex Zhukovsky
1. мне тяжело представить когда это реально нужно
2. без трансмута обратно в старый лайфтайм это инста-уб
Эти ссылки хранятся в массиве, который умирает внутри функции, а вектор возвращается фукнцией, так что ссылки не могут пережить реальные объекты.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Вектор изменяется только push'ами.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Сами стринги внутри вектора не меняются.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Я пишу ансейф, а не UB.
источник

r

red75prime in Rust — русскоговорящее сообществo
Эрик
Да, спасибо, конечно я буду всю стрингу копировать, вместо ссылки на неё.
transmute отвязывает ссылку на &str от вектора, надо полагать для того, чтобы вектор изменять. В результате имеем иммутабельную ссылку внутрь вектора и мутабельную ссылку на вектор (тот же push принимает &mut self), то есть UB
источник

Э

Эрик in Rust — русскоговорящее сообществo
red75prime
transmute отвязывает ссылку на &str от вектора, надо полагать для того, чтобы вектор изменять. В результате имеем иммутабельную ссылку внутрь вектора и мутабельную ссылку на вектор (тот же push принимает &mut self), то есть UB
Нет, смотри, есть Vec<String>.
источник

А⚙

Антон ⚙️ in Rust — русскоговорящее сообществo
Эрик
Вектор изменяется только push'ами.
У тебя вектор может переаллоцировать данные на пуше и инвалидировать ссылки
источник

Э

Эрик in Rust — русскоговорящее сообществo
И String не изменяется, но храниться должен именно так, чтобы его потом вернуть.
источник

r

red75prime in Rust — русскоговорящее сообществo
Антон ⚙️
У тебя вектор может переаллоцировать данные на пуше и инвалидировать ссылки
Нет. Там ссылка на данные строки - &str
источник

А⚙

Антон ⚙️ in Rust — русскоговорящее сообществo
red75prime
Нет. Там ссылка на данные строки - &str
Вот именно
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
red75prime
Нет. Там ссылка на данные строки - &str
и? Вектор не может дропнуть String на который ссылается str?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Антон ⚙️
Вот именно
Вектор при переаллокации копирует байты в новое, но копирует старые байты.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Стринга хранит данне не в себе, а как и вектор - в куче.
источник

r

red75prime in Rust — русскоговорящее сообществo
Эрик
И String не изменяется, но храниться должен именно так, чтобы его потом вернуть.
MIRI что по этому поводу говорит?
источник