Как обновить коллекцию внутри структуры в Rust?

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

На самом деле проблема проста:

use std::collections::BTreeSet;

pub struct Service {
    blobs: BTreeSet<u16>,
}

impl Service {
    fn new() -> Self {
        let bt: BTreeSet<u16> = BTreeSet::new();
        Self { blobs: bt }
    }

    fn insert(&self, val: u16) -> bool {
        &self.blobs.insert(val);
        true
    }
    fn print(&self) {
        println!("{}", self.blobs.len());
    }
}
fn main() {
    let s: Service = Service::new();
    s.print();
    s.insert(4);
    s.print();
}

При компиляции я получаю:

^^^^^^^^^^ себяis a& reference, so the data it refers to cannot be borrowed as mutable

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

Поэтому я попробовал с

pub struct Service {
    blobs: &'static mut BTreeSet<u16>,
}

и

  fn new() -> Self {
        let bt: &mut BTreeSet<u16> = &mut BTreeSet::new();
        Self { blobs: bt }
    }

но это дает creates a temporary value which is freed while still in use (хотя исходная ошибка все еще существует, так что теперь у меня есть две...)

Я понимаю, что нужно как-то сделать BTreeSet изменяемым, но как?

Почему нельзя использовать &mut self в insert()?

Chayim Friedman 27.08.2024 05:09

@ChayimFriedman хороший вопрос - я не знаю? То есть, мне это даже в голову не пришло. Исходя из других языков, идея заключается в том, что мне нужно изменить член объекта, что пометить весь объект как изменяемый даже возможно, это похоже на ошеломление для меня и что-то вроде изменения парадигмы...

unsafe_where_true 27.08.2024 05:24

вы просто говорите: «Вставьте объект, который должен быть мутным». Не всем методам требуется изменяемое «я».

Stargateur 27.08.2024 05:28
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
3
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В большинстве случаев сообщение об ошибке просто сообщает вам, как исправить код, да здравствует компилятор Rust.

PS *******************> cargo run --bin mess_around
   Compiling mess_around v0.1.0 (*******************)
error[E0596]: cannot borrow `self.blobs` as mutable, as it is behind a `&` reference
  --> mess_around\src/main.rs:14:9
   |
14 |         self.blobs.insert(val)
   |         ^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be borrowed as mutable
   |
help: consider changing this to be a mutable reference
   |
13 |     fn insert(&mut self, val: u16) -> bool {
   |               ~~~~~~~~~

For more information about this error, try `rustc --explain E0596`.
error: could not compile `mess_around` (bin "mess_around") due to 1 previous error

Зафиксированный

use std::collections::BTreeSet;

pub struct Service {
    blobs: BTreeSet<u16>,
}

impl Service {
    fn new() -> Self {
        let bt: BTreeSet<u16> = BTreeSet::new();
        Self { blobs: bt }
    }

    fn insert(&mut self, val: u16) -> bool {
        self.blobs.insert(val)
    }
    fn print(&self) {
        println!("{}", self.blobs.len());
    }
}
fn main() {
    let mut s: Service = Service::new();
    s.print();
    s.insert(4);
    s.print();
}

Другие вопросы по теме