LINUX.ORG.RU

Вопрос по Rust

 


0

3

Как сделать что бы это скомпилировалось?

struct A {
    b: B,
}

struct B;

impl B {
    fn fun(&self, a: &mut A) {
        println!("OK");
    }
}

fn main() {
    let mut a = A{b: B};
    a.b.fun(&mut a);
}

Ссылка на playground: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=5247385ca0f8473e46d6d91112059dce

Никак. Две мутабельных ссылки на одну переменную взять нельзя.

Что именно с этим делать зависит от решаемой задачи. Можно использовать немутабельные ссыки и interior mutability (т.е. завернуть типы в Cell, RefCell, Mutex и т.п.), можно передавать в fun только нужную часть A (т.е. a.b.fun(&mut a.c))

red75prim ★★★
()

А чем такое не подходит? https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=453742cf44f6605e1c84d8709e660d39

Кажется, что у тебя логическая ошибка. Ты пытаешься вызвать метод с &self, это создает immutable borrow на переменную a, а дальше его нельзя уже заимствовать как мутабельную переменную в функцию fun, так как уже существует другая ссылка. В общем, borrow checker тебя предостерег от ошибок, о которых ты кажется, что даже не догадывался.

Вот прям в ошибке и описано: https://doc.rust-lang.org/stable/error_codes/E0502.html

AntonyRF ★★★★
()
Последнее исправление: AntonyRF (всего исправлений: 1)
Ответ на: комментарий от red75prim

Никак. Две мутабельных ссылки на одну переменную взять нельзя.

Больше бутылки в одни руки не давать! - требование очереди в винном магазине времен перестройки.

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

Больше бутылки в одни руки не давать! - требование очереди в винном магазине времен перестройки.

Как-то я даже рад, что подобного уровня комментаторы идут в хейтеры раста, а не в любители. Пишите на сишечке, дорогой @alysnix, всех вам благ, в поганый раст соваться вам не недо

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

зачем в хрусте писать запятую после последнего поля в структуре?

 let mut a = A::default();

это на стеке переменная инициализируется некой структурной константой через копирование?

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от us976

А что мешает метод fun перенести в структуру А?

Если бы ничего не мешало то и не спрашивал. А так в первом и втором комментариях я получил ответ. Придется менять структуру программы.

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

при этом зачем-то повторяется описание всей структуры

не понял суть претензии. Есть стуктура, есть её определение и есть инстанциирование. Бл@t’, во всех языках так, даже в Си

struct A {
    int b
    
};

int main(void) {
    struct A a = {
        .b=100
    };
}

называется designated initializers, впервые слышишь, систэмный программист?

FishHook
()
Последнее исправление: FishHook (всего исправлений: 1)
Ответ на: комментарий от FishHook

вообще то это не «инстанцирование». инстанцирование это типа

A a

а вот выражение вида

A a = {труляля}

это уже присваивание <труляли> уже инстанцированной переменной… совсем вы там с своем русте не понимаете что к чему.

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

зачем в хрусте писать запятую после последнего поля в структуре?

Что бы не писать (не забыть) когда добавишь еще одно поле.

SyntaxError
() автор топика
Последнее исправление: SyntaxError (всего исправлений: 1)
Ответ на: комментарий от SyntaxError

Что бы не писать (не забыть) когда добавишь еще одно поле.

вот не помню, кто эту хохму с запятыми придумал(в каком языке это впервые появилось), но уже тогда она была просто смешным синтаксическим сахаром…

мотивация для этого синт. правила такова - поскольку я всегда забываю удалить запятую, удалив последний элемент в перечислении(списке и те. пе) то пусть компилятор это терпит.

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

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

мотивация для этого синт. правила такова - поскольку я всегда забываю удалить запятую, удалив последний элемент в перечислении(списке и те. пе) то пусть компилятор это терпит.

Нет же. Это для красивых diff.

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

да это уже просто клоунада какая-то. В Си который здешние долбодятлы боготворят, trailing comas есть уже 25 лет, но они про это не знают, и когда видят раст с запятыми они правда на полном серьезе думают, что сейчас выдадут бугагашечку - какие же тупые растомакаки, запятые ставят

FishHook
()
Последнее исправление: FishHook (всего исправлений: 1)
Ответ на: комментарий от SyntaxError

вы то чего втыкаете эту очевидно лишнюю запятую, когда она опциональна и есть чисто синтаксическая грязь ради некоего сомнительного удобства.

причем ее втыкают везде в русте, судя по всяким мануалам.

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

вы то чего втыкаете эту очевидно лишнюю запятую, когда она опциональна

Эмм, камрад, опционально - значит можно делать, а можно не делать. Что именно тебе мешает понять эту простую концепцию?

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

зачем делать, если можно не делать? или «принцип наименьшего действия». гамильтонианы, лагранжианы.

https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%B3%D0%BE_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D1%8F

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

А! Я понял! Дружище, я открою нечто новое сейчас для тебя - профессиональные разработчики вообще не заморачиваются стилистическим оформлением кода, за нас толпа линтеров работает - расставляет запятые, переносы, пробелы, всякую херню делают, мы вообще не паримся. Это вообще то, ради чего компьютер придумали - чтобы избавить от рутины. Если ты думаешь, что те программы, которые ты видишь на гитхабе, которые так красивенько по столбикам и скобочка под скобочкой, если ты думаешь что кто-то вручную это все верстал и выравнивал, ну ты очень очень очень далек от понимания процесса. Правда, не стоит тебе писать в этой теме

FishHook
()
Последнее исправление: FishHook (всего исправлений: 1)
Ответ на: комментарий от SyntaxError

еще в русте кучеряво выглядит написание «метода» с явным селфом, что уважающий себя с++ (например) опускает за ненадобностью.

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

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

Дорогой, ну ты же не читал учебник по расту, правда? Если бы читал, ты бы знал, какое значение имеет селф в методе, знал бы что есть три селфа, знал бы что можно сделать метод без селфа и знал бы в чем различие, знал бы как работает lifetime elision, да о чем я - ты просто не понимаешь о чем пишешь. Человек, который говорит то чего не понимает, знаешь как называется? Начинается на Д, а заканчивается на Б, 7 букв

FishHook
()