LINUX.ORG.RU

Rust: Как хранить &str в структуре?

 


1

5

Что я хочу:

struct Foo
{
    const char * name;
};
 
void Bar(struct Foo * foo)
{
    foo->name = "Name";
}
Теперь на Руст:
struct Foo<'a> {
    name: &'a str
}

impl<'a> Foo<'a> {

    fn bar(&self) {
        self.name = "nm";
    }
}
Это не конпелируется:
error[E0594]: cannot assign to `self.name` which is behind a `&` reference
  --> src/main.rs:26:9
   |
25 |     fn bar(&self) {
   |            ----- help: consider changing this to be a mutable reference: `&mut self`
26 |         self.name = "nm";
   |         ^^^^^^^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be written
Как это тут это всё вот?

Пы Сы: В итоге, это должно быть так:

struct Foo<'a> {
    name: &'a str
}

impl<'a> Foo<'a> {

    fn bar(&mut self) {
        self.name = "nm";
    }
}

★★★★★

Последнее исправление: meliafaro (всего исправлений: 1)

дожили. пятизвездочники не умеют читать ошибки

anonymous
()
Ответ на: комментарий от kote4ka

Теперь так:

struct Foo<'a> {
    name: &'a str
}

impl<'a> Foo<'a> {
    fn bar(&mut self) -> Foo {
        self.name = "jhjshdjf";
    }
}
error[E0308]: mismatched types
  --> src/main.rs:24:26
   |
24 |     fn bar(&mut self) -> Foo {
   |        ---               ^^^ expected struct `Foo`, found `()`
   |        |
   |        implicitly returns `()` as its body has no tail or `return` expression

error: aborting due to previous error

meliafaro ★★★★★
() автор топика
Ответ на: комментарий от Legioner

От старого кода осталась, короче, сложно объяснить) Слишком много раз нажал Ctrl-Z. И не заметил.

meliafaro ★★★★★
() автор топика

оставь это. программирование - не твое

anonymous
()

В &str хранить строку нельзя. Для этого был бы String. Можно хранить ссылку.

Ты пытаешься присвоить статическую сторону вкомпиленую в бинарь в методе. Это ок. Но ты это делаешь в иммутабелном методе. Пиши &mut self в сигнатуре метода.

Даже не спрашиваю зачем тебе такое

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Я знаю, что &str - это строковые литералы, типа как в Си. В коде они иногда всё равно встречаются, ну, типа:

struct Month
{
    const char * month_name;
    unsigned char days;
};
 
void fill(struct Month * m)
{
    m->month_name = "December";
    m->days = 31;
}

Даже не спрашиваю зачем тебе такое

Для околохэллоуворлдных экспериментов. Я книжку по Руст второй день читаю с нуля.

meliafaro ★★★★★
() автор топика
Ответ на: комментарий от meliafaro

Используй

struct Foo {
    bar: String
}

или

struct Foo {
    bar: &'static str
}

Не используй lifetime параметры структуры без необходимости. С ними сложнее писать код т.к. надо больше переменных в голове держать и они замедляют и без того небыструю компиляцию раста. Для константных строк в коде тебе &'static str хватит полностью, если ты жалеешь байты памяти на String.

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

Да, вот так вообще хорошо. Почти идеально.

Жалко не байтов, жалко обращений за динамической памятью. Ну, вроде системный язык, а на каждый чих лезет в кучу. Ну, это я пока так, присматриваюсь, сравниваю.

Мы тут ещё походим, посмотрим.(с)

meliafaro ★★★★★
() автор топика
Ответ на: комментарий от kote4ka

Если этот метод есть для &str, значит он почти наверняка есть и для String. Но даже если нет, то String всегда можно привести к &str без дополнительных аллокаций. Например вот так:

let a: String = format!("hello world");
let b: &str = &*a;

Когда lifetime у b закончится, a освободится

Aswed ★★★★★
()

Раст - язык с очень высоким порогом входа. Когда начинаешь будет очень много WTF в минуту. Потом, как разберешься в основах приходит грусть «почему они не сделали это и то». И только потом приходит просветление «ну перепишу как просят и станет вообще зашибись» и нежелание возвращаться к другим языкам программирования

q0tw4 ★★★★
()
Ответ на: комментарий от meliafaro

жалко обращений за динамической памятью

Если узаешь стековую память будь готов доказать компилятору, что пока на нее есть ссылки, она не удалится. Причем если ссылка удаляется одновременно с самой памятью будь готов к тому, что доказать может и не получится, так как в расте не определен порядок удаления полей структуры. Если сильно надо станет, придется засунуть unsafe, причем чтоб сделать это кошерно, надо хорошо разбираться в теории. Ну или подключить еще одну готовую либу чисто ради того, чтоб сделать ссылку на строку с доказанным (авторами либы) отсутствием UB

q0tw4 ★★★★
()
Ответ на: комментарий от q0tw4

так как в расте не определен порядок удаления полей структуры

Вообще-то определён:

Struct fields are dropped in the same order as they are declared.

https://github.com/rust-lang/rfcs/blob/master/text/1857-stabilize-drop-order.md

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

DarkEld3r ★★★★★
()
Ответ на: комментарий от q0tw4

Раст - язык с очень высоким порогом входа.

Простейший язык, хз о чем все говорят.

kote4ka
()
Ответ на: комментарий от Aswed

Какое позорище. Ни первое ни второе ни эквивалент показанному.

Не используй lifetime параметры структуры без необходимости. С ними сложнее писать код

Ну т.е. не писать ничего. Так и запишем - писать только хеловорлды.

если ты жалеешь байты памяти на String

Байты памяти? Там про аллокации, исключения и прочее тебе ещё не рассказали?

rafyibofye
()
Ответ на: комментарий от q0tw4

Атомик, либо любой другой примитив перепишешь? Давай, действуй.

rafyibofye
()
Ответ на: комментарий от q0tw4

с доказанным (авторами либы) отсутствием UB

Доказательства покажешь? Берёшь stdlib, берёшь любую строчку и доказываешь отсутствие UB.

rafyibofye
()
Ответ на: комментарий от rafyibofye

Какое позорище. Ни первое ни второе ни эквивалент показанному.

Кек. Типичный анон на ЛОРе. Кидаться говном без пруфов.

исключения, rust

nuff said

Aswed ★★★★★
()
Ответ на: комментарий от rafyibofye

Какое позорище. Ни первое ни второе ни эквивалент показанному.

Почему вариант со &'static str не эквивалент? В примере вообще-то как раз статическая строка и используется.

DarkEld3r ★★★★★
()
Ответ на: комментарий от Aswed

Кек. Типичный анон на ЛОРе.

Анон здесь ты. Это раз.

Кидаться говном без пруфов.

Каких пруфов? Запиши туда временный объект.

nuff said

Типичный анон без пруфов. Я понимаю, что у вас там всем плохо даже с базовыми знаниями, но ты бы хоть не позорился, а? Иди почитай букварь.

rafyibofye
()
Ответ на: комментарий от DarkEld3r

Почему вариант со &’static str не эквивалент?

Допустим даже потому, что там const *, т.е. ссылка мутабельная. В любом случае дело не в этом.

В примере вообще-то как раз статическая строка и используется.

Это не так работает. Нельзя смысл конструкции свести к примеру автора, который в принципе не состоятелен. Это типичная проблема, потому как адепты потом делают далеко идущие и неправильные выводы.

rafyibofye
()
Ответ на: комментарий от DarkEld3r

Вон выше мы видим типичную жертву пропаганды, которая даже не знает о существовании исключений и в целом том, благодаря чему упомянутый ворованный string и работает.

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

rafyibofye
()
Ответ на: комментарий от meliafaro

выразительный

У тебя потекла методичка:

void fill(struct Month * m)
{
    m->month_name = "December";
    m->days = 31;
}

О какой выразительности ты в принципе можешь говорить, используя стиль дерьма и не осилив даже капли выразительности? У тебя нет вкуса, у тебя нет каких-либо представлений о чём-то. Зачем ты позволяешь себе что-то утверждать?

rafyibofye
()
Ответ на: комментарий от q0tw4

Боже, да тут одно откровений лучше другого.

Если узаешь стековую память будь готов доказать компилятору

Это недоразумение не обладает моделью памяти и ни в какую «не-стековую» память не может.

что пока на нее есть ссылки, она не удалится.

Такой нелепой чуши там так же нету. Никаких доказательств нет. Есть ручное прописывание алиасов.

так как в расте не определен порядок удаления полей структуры.

Никакого «удаление» в этом недоразумении и это ни на что не влияет. Есть птушный drop, но он просто предполагает mut, а mut может быть только один. Такая же история с любой мутирующей операцией.

причем чтоб сделать это кошерно, надо хорошо разбираться в теории.

Фанатики делают, а вернее воруют это, как угодно. Никаких подобных базвордов там нет. Так же, никто ни в какой теории не разбирается и это чушь какая-то. Нужно просто мочь писать, другое дело, что ЦА этой скриптухи те, кто писать не могут не на скриптухи.

Про потуги на тему доказательств я говорил выше. Это полная чушь. Никаких доказательств нигде не существует.

rafyibofye
()
Ответ на: комментарий от Aswed

Нет ты

Создадим голосование? Если обделаешься, то согласен выйти в окно? Или очередное трепло?

Которые я влОжил

Чё ты там «влОжил», побежал почитал букварь про исключения и решил с темы съехать? Позорище нелепое.

Что-то ты быстро как-то осознал своё место, даже что-то возразить мне не попытался, решил не закапывать себя ещё глубже? Позорище х2.

rafyibofye
()
Ответ на: комментарий от Aswed

Результат очевиден. Это не перестанет никогда меня удивлять. Адепт так яро начинает кукарекать. Про «анон», про скриптуху. Потом осознаёт то на кого попал и тут же ломается.

rafyibofye
()
Ответ на: комментарий от rafyibofye

на кого попал

И правда, на кого попал?

Если обделаешься, то согласен выйти в окно

яро начинает кукарекать

типичную жертву пропаганды

ворованный string

поголовно несостоятельными фанатиками-балаболами

Ну явно не на адекватного человека

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

В этом все фанатики. Можно ещё раз перечитать то, как он яро кукарекал про исключения, про «анон» и посмотреть на его поведение сейчас. Как же он быстро обо всё забыл, когда сюда пришёл я. А до этого он как резвился и херню нёс, потому как никто за балабольство спросить не мог.

Типичное трепло, типичная ЦА этой скриптухи.

rafyibofye
()
Ответ на: комментарий от meliafaro

Они в последние годы хорошо так прокачали фичи, так что раст в 2020 уже почти торт. А вот раньше грустно было

q0tw4 ★★★★
()
Ответ на: комментарий от EXL

Да у меня тут ещё много вопросов осталось. Это не показатель. После ООП-С++ структурно-функциональный Руст воспринимается не всегда на ура, отсюда и вопросы.

meliafaro ★★★★★
() автор топика
Ответ на: комментарий от q0tw4

Я джня три РастБук читаю, эти доисторические времена для меня представляют разве что исторический интерес.

meliafaro ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.