Возможно этот вопрос уже задавался, возможно в другой формулировке, но я его не нашел. Если из-за этого его закроют, извините, но я уже пытался раньше.
На самом деле проблема проста:
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
изменяемым, но как?
@ChayimFriedman хороший вопрос - я не знаю? То есть, мне это даже в голову не пришло. Исходя из других языков, идея заключается в том, что мне нужно изменить член объекта, что пометить весь объект как изменяемый даже возможно, это похоже на ошеломление для меня и что-то вроде изменения парадигмы...
вы просто говорите: «Вставьте объект, который должен быть мутным». Не всем методам требуется изменяемое «я».
В большинстве случаев сообщение об ошибке просто сообщает вам, как исправить код, да здравствует компилятор 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();
}
Почему нельзя использовать
&mut self
вinsert()
?