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

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

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

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

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

27 ответов

35 просмотров

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- Автор вопроса
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 русских букв?

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

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

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Почему стало ломаться на D11? "739002.86400000' is not a valid timestamp" function IncDateTime(aStamp:TTimeStamp;aKind:TTriggerKind;aInterval:Integer):TDateTime; //aStamp = 2...
Катерина Свиридова
8
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Есть ли смысл устраиваться на 1с ? Даст это плюс в дальнейшем трудоустройстве на php? Просто у меня в городе вакансий на пхп нету. Или лучше удаленно искать. Опыта работы нету...
Azamat
14
Не ну фпц - это уже просто троллинг какой-то. Элементарный код нельзя собрать. ЧЯДНТ? program Project1; {$mode delphi} uses SysUtils, Classes, Generics.Collections; var...
Peter
4
а где есть mysql cloud кроме яндекс-клауд?
Oleg Nosov
13
hi im a cs student. i need some advice from people who have enough experience in Embedded Software. I need to know whether this profession is suitable for me. I have watched s...
Sahand 🏔️
8
А кто-нибудь запихивал сборку перловых модулей/образов с perl приложениями в окружения без интернета (в специализированном CI/CD)? У меня сейчас есть ряд cpanfile, которые н...
Andrey Smirnov / 𝓪𝓵𝓵𝓽𝓮𝓻 /
14
Карта сайта