допустим у меня есть два метода, insert(val: &str) и read() -> String.
В случае insert, я могу строку спокойно везде передавать как &, копироваться будет только ссылка.
Написать метод, который возвращает & нельзя, потому что стековый кадр выгрузится и оригинальное значение удалится, тут всё понятно.
Собственно вопросы:
1) String аллоцируется в куче, я правильно понимаю, что могу спокойно передавать везде тип String и данные будут скопированы по значению только при вызове clone()?
2) Иммет ли смысл заменить String на Box<str>? Оба будут аллоцированы в куче, но Box<str> иммутабельный насколько я понял.
fn return_string_slice(input: &str) -> &str { input }
Написать метод который возвращает & нельзя — почему? Из метода можно спокойно возвращать ссылку на что-либо. 1) Если ты передашь String в метод или функцию, то он мувнется в скоп этой функции/метода, при clone() он клонируется, и оригинальная стринга останется. (Но клонить стрингу не самая лучшая идея, это может быть затратно) 2) https://www.reddit.com/r/rust/comments/veeq0q/what_is_boxstr_and_how_is_it_different_from/
тут понятно почему будет работать, но у меня немного другой случай
Назови этот случай
это нужно описывать типами, потому, что вполне можно ссылку вернуть, если она завсит от чего-то снаружи
у меня идёт чтение из бд, как раз зависимости снаружи нет, читаю структуру типа struct User { name: String .... }
Почему нет? Ты же снаружи массив байт получаешь
Лайфтайм буфера с этими байтами скорее всего вложен в длительность вызова, т.ч. одолжить его не получится
структура же снаружи async fn get(&self, id: String) -> Option<User> { let user_id = bson::oid::ObjectId::parse_str(&id).ok()?; return self .collection .find_one(doc! { "_id": user_id }, None) .await .ok()?; }
Сразу видно что монга
ObjectId как бы намекает, но даже если бы я читал из PG это не повлияло бы на ситуацию
Ну вот допустим у тебя юзер это имя+фамалия+возраст+еще чего-нибудь ты можешь сделать что-то типа borrow_name(user: &User) -> &str и иметь ссылку, которая будет жива, пока жив User
borrow_name(user: &User) -> &str не похоже на функцию чтения из БД
в примере там скрыто библиотекой то, на что можно ссылаться
типа, передать пустую структуру по ссылке и заполнить во время чтения? borrow_name(user: &User) -> ()
Это не поможет, ты все равно будешь копировать в нее данные
1 раз как говорится
нет, взять из юзера имя и манипулировать легким &str, а не String
1) Да, мув String это дешевая операция, которая не затрагивает буфер в куче 2) Ну ты выиграешь так копейки
но юзкейс другой, прочитать данные со стороками из бд, получив на вход id стркоовый (его как раз можно передать как &str)
ты просто писал, что невозможно отдать из функции ссылку
я потом в целом согласился, что технически это возможно, но у меня задача немного другая
Посмотри на SmolStr
Вот ещё: https://github.com/ParkMyCar/compact_str
Это значит что в него поместится 12 русских букв?
Обсуждают сегодня