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

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

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

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

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

27 ответов

72 просмотра

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 русских букв?

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта