У меня есть структурный тип с полем Option<String>
.В методе моего необязательного типа я хочу сопоставить это поле и извлечь значение в локальную область.Я понимаю, что мне нужно убедить контролера заимствования не бросать память, на которую указывает мой структурный тип;Я не уверен, как это сделать.
Для контекста, это явно неправильный пример.
struct Cell {
data: Option<String>,
}
impl Cell {
fn match_me(&self) -> String {
match self.data {
Some(x) => x,
None => "match failed".to_owned(),
}
}
}
fn main() {
let data = Some("hello".to_owned());
let my_cell = Cell { data };
let result = my_cell.match_me();
print!("{}", result);
}
Эта программа явно не так, потому что я перемещаю значение внутри x
в локальную область, что означает, что он будет отброшен при возврате метода;однако, поскольку структура переживает вызов метода, значение все равно будет доступно в другом месте, что приведет к использованию после ошибки free .
Поскольку я хочу использовать значение Some()
безОтказавшись от этого, я решил, что я должен сосчитать это.Попытка два:
use std::rc::Rc;
struct Cell {
data: Rc<Option<Rc<String>>>,
}
impl Cell {
fn match_me(&self) -> String {
let local = self.data.clone();
match *local {
Some(x) => *Rc::clone(&x),
None => "match failed".to_owned(),
}
}
}
fn main() {
let data = Rc::new(Some(Rc::new("hello".to_owned())));
let my_cell = Cell { data };
let result = my_cell.match_me();
print!("{}", result);
}
Однако, несмотря на клонирование этих ссылок, я все еще получаю ошибку заимствования.
Compiling playground v0.0.1 (file:///playground)
error[E0507]: cannot move out of borrowed content
--> src/main.rs:10:15
|
10 | match *local {
| ^^^^^^ cannot move out of borrowed content
11 | Some(x) => *Rc::clone(&x),
| - hint: to prevent move, use `ref x` or `ref mut x`
error[E0507]: cannot move out of borrowed content
--> src/main.rs:11:24
|
11 | Some(x) => *Rc::clone(&x),
| ^^^^^^^^^^^^^^ cannot move out of borrowed
content
Неужели у меня нет другого выхода, кроме clone
самого предмета?
Playground Ссылка на явно неправильный пример.
Детская площадка Ссылка на счетный кошмар.