172 похожих чатов

Всем привет, дошел до строк в расте, немного запутался. Вот

допустим у меня есть два метода, insert(val: &str) и read() -> String.

В случае insert, я могу строку спокойно везде передавать как &, копироваться будет только ссылка.
Написать метод, который возвращает & нельзя, потому что стековый кадр выгрузится и оригинальное значение удалится, тут всё понятно.

Собственно вопросы:
1) String аллоцируется в куче, я правильно понимаю, что могу спокойно передавать везде тип String и данные будут скопированы по значению только при вызове clone()?
2) Иммет ли смысл заменить String на Box<str>? Оба будут аллоцированы в куче, но Box<str> иммутабельный насколько я понял.

27 ответов

92 просмотра

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/

rdcm- Автор вопроса
Alexey Ermakov
fn return_string_slice(input: &str) -> &str { ...

тут понятно почему будет работать, но у меня немного другой случай

rdcm
тут понятно почему будет работать, но у меня немно...

это нужно описывать типами, потому, что вполне можно ссылку вернуть, если она завсит от чего-то снаружи

rdcm- Автор вопроса
Alexey Ermakov
это нужно описывать типами, потому, что вполне мож...

у меня идёт чтение из бд, как раз зависимости снаружи нет, читаю структуру типа struct User { name: String .... }

rdcm
у меня идёт чтение из бд, как раз зависимости снар...

Почему нет? Ты же снаружи массив байт получаешь

Alexey Ermakov
Почему нет? Ты же снаружи массив байт получаешь

Лайфтайм буфера с этими байтами скорее всего вложен в длительность вызова, т.ч. одолжить его не получится

rdcm- Автор вопроса
Alexey Ermakov
Почему нет? Ты же снаружи массив байт получаешь

структура же снаружи 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()?; }

rdcm- Автор вопроса
asahi🇷🇺
Сразу видно что монга

ObjectId как бы намекает, но даже если бы я читал из PG это не повлияло бы на ситуацию

rdcm
структура же снаружи async fn get(&self, id: Str...

Ну вот допустим у тебя юзер это имя+фамалия+возраст+еще чего-нибудь ты можешь сделать что-то типа borrow_name(user: &User) -> &str и иметь ссылку, которая будет жива, пока жив User

Alexey Ermakov
Ну вот допустим у тебя юзер это имя+фамалия+возра...

borrow_name(user: &User) -> &str не похоже на функцию чтения из БД

Mikail Bagishov
borrow_name(user: &User) -> &str не похоже на функ...

в примере там скрыто библиотекой то, на что можно ссылаться

rdcm- Автор вопроса
Alexey Ermakov
Ну вот допустим у тебя юзер это имя+фамалия+возра...

типа, передать пустую структуру по ссылке и заполнить во время чтения? borrow_name(user: &User) -> ()

Это не поможет, ты все равно будешь копировать в нее данные

rdcm
типа, передать пустую структуру по ссылке и заполн...

нет, взять из юзера имя и манипулировать легким &str, а не String

1) Да, мув String это дешевая операция, которая не затрагивает буфер в куче 2) Ну ты выиграешь так копейки

rdcm- Автор вопроса
Alexey Ermakov
нет, взять из юзера имя и манипулировать легким &s...

но юзкейс другой, прочитать данные со стороками из бд, получив на вход id стркоовый (его как раз можно передать как &str)

rdcm
но юзкейс другой, прочитать данные со стороками из...

ты просто писал, что невозможно отдать из функции ссылку

rdcm- Автор вопроса
Alexey Ermakov
ты просто писал, что невозможно отдать из функции ...

я потом в целом согласился, что технически это возможно, но у меня задача немного другая

Посмотри на SmolStr

Andrey Likhachev
Посмотри на SmolStr

Вот ещё: https://github.com/ParkMyCar/compact_str

mental stability🥺✨
Вот ещё: https://github.com/ParkMyCar/compact_str

Это значит что в него поместится 12 русских букв?

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта