Im folgenden Code (playground):Kann leiht nicht 'X' als wandelbar mehr als einmal zu einem Zeitpunkt
struct Node {
datum: &'static str,
edges: Vec<Node>,
}
fn add<'a>(node: &'a mut Node, data: &'static str) -> &'a Node {
node.edges
.push(Node {
datum: data,
edges: Vec::new(),
});
&node.edges[node.edges.len() - 1] // return just added one
}
fn traverse<F>(root: &Node, callback: &F)
where F: Fn(&'static str)
{
callback(root.datum);
for node in &root.edges {
traverse(node, callback);
}
}
fn main() {
let mut tree = Node {
datum: "start",
edges: Vec::new(),
};
let lvl1 = add(&mut tree, "level1");
traverse(&mut tree, &|x| println!("{:}", x)); //I actually don't need mutability here
}
Ich habe diese Art von Fehlern:
error[E0499]: cannot borrow `tree` as mutable more than once at a time
--> src/main.rs:32:19
|
30 | let lvl1 = add(&mut tree, "level1");
| ---- first mutable borrow occurs here
31 |
32 | traverse(&mut tree, &|x| println!("{:}", x)); //I actually don't need mutability here
| ^^^^ second mutable borrow occurs here
33 | }
| - first borrow ends here
Meine Frage scheint zu sein, sehr ähnlich zu Why does Rust want to borrow a variable as mutable more than once at a time?, aber ich bin mir nicht sicher. Wenn ja, gibt es einen Workaround für diesen Fall?
Der Teufel ist das. Wenn der Compiler den Funktionskörper nicht verarbeiten kann, um betroffene Teile von Strukturen zu bestimmen, und es gibt keine Möglichkeit, einen Hinweis darauf zu geben ... Dann a) Warum haben sie das gemacht? (im Namen von Datenrennen?); b) Wie schlagen sie vor, in solchen Situationen zu programmieren? – tower120
Der Compiler kann Funktionskörper verarbeiten, wenn sie sich in Ihrer Kiste befinden, aber wie schlagen Sie vor, externe * binäre * Abhängigkeiten zu behandeln? Sie enthalten nicht genügend Informationen für den Compiler. Daher ist dies der einzige Weg, das Modell des Eigentums und der Kreditaufnahme zu vervollkommnen, also ja, "sie haben das getan" für viele Dinge einschließlich der Bekämpfung von Datenrennen. Wie man in solchen Situationen programmieren kann, gibt es keine Möglichkeit, den Code neu zu strukturieren, zum Beispiel können Sie in Ihrem speziellen Fall die Einfügung und die Suche in zwei Methoden aufteilen, wobei die Einfügung nichts zurückgibt, wodurch das Ausleihen vermieden wird . –
"Der Compiler kann Funktionskörper verarbeiten, wenn sie in Ihrer Kiste sind, aber wie schlagen Sie vor, externe binäre Abhängigkeiten zu behandeln?" - Als unsicher markieren, nicht behandeln (sie sind extern, afterall). "Wie man in solchen Situationen programmiert, es gibt keinen anderen Weg, als den Code neu zu strukturieren" - das mag ich nicht. Code umstrukturieren, nur um dem Compiler einen Sinn zu geben? Es hört sich überhaupt nicht gut an ... – tower120