2016-09-16 1 views
1

Ist es in Rust möglich, einen Kontext für das Verfallen eines Objekts explizit anzugeben? Zum Beispiel einer Grafik Manipulation Code vorstellen, dass so etwas wie dies funktioniert:Objekt ablaufen lassen bei einer Statusänderung in Rust

// borrow an edge from the graph 
let edge : &Edge = graph.findEdge(...); 
// modify the edge 
let new_edge : &Edge = graph.splitEdge(edge, vertex); 
// the old edge is invalid now, this should be an compiler error now! 
edge.something 

Im Allgemeinen ist es eine Möglichkeit, eine Lebensdauer eines Objekts in einem Zustand oder eine Zustandsänderung zu verbinden?

Antwort

1

Wenn Sie Ihren Code mit Ihren Kommentaren abgleichen, erhalten Sie einen Compilerfehler, allerdings nicht an der von Ihnen gewünschten Position. Ihr aktueller Code ist im Grunde this. In diesem Fall sieht split_edge wie folgt aus:

fn split_edge(&self, edge: &Edge) -> &Edge {} 

Dieses Sie entweder die Grafik oder den Rand ändern nicht gestattet. Daher kann diese Funktion die Kante nicht ungültig machen. Wenn Sie sich selbst als wandelbar leihen, erhalten Sie einen Compiler-Fehler, weil Sie bereits selbst als unveränderlich ausleihen:

fn split_edge(&mut self, edge: &Edge) -> &Edge {} 
// error: cannot borrow `graph` as mutable because it is also borrowed as immutable [--explain E0502] 

Sie auch in fehlerfrei laufen würden, wenn Sie Rand statt wandelbar leihen.

Wenn die Kante nicht wirklich ungültig ist, indem Sie sie einfach wiederverwenden möchten, verwenden Sie einfach den Variablennamen edge anstelle von new_edge.

let edge : &Edge = graph.find_edge(); 
let edge : &Edge = graph.split_edge(edge); 
+0

Ich verstehe nicht ganz, warum der Fehler E0502 an erster Stelle auftritt. Sicher, ich leihe 'Grafik' für den Aufruf der Methode find_edge(), aber die Funktion gibt zurück, bevor split_edge() aufgerufen wird, sollte also nicht die ausgeliehene Referenz bis dahin ablaufen? Wie soll ich vorgehen, wenn ich wirklich möchte, dass die Kante ungültig gemacht wird und nicht nur die Variable wiederverwendet wird? – MrMobster

+1

Wenn Sie 'let edge: & Edge = graph.findEdge (...);' aufrufen, wird 'edge' aus' graph' entlehnt, bis sie ('edge') den Gültigkeitsbereich verlässt. In meinem Beispiel ist das bis zum Ende von 'main()'. Es ist schwierig für mich, Ihre genauen Anforderungen zu verstehen, daher kann ich nicht sagen, was Sie ändern müssen. Aber es scheint mir seltsam, dass Sie das Ergebnis von 'find_edge' an' split_edge' übergeben. Können Sie zum Beispiel nicht die Parameter 'find_edge' zu' split_edge' hinzufügen? Vielleicht kombiniert mit einem zusätzlichen Block, um die Lebensdauer von 'Edge' zu ​​begrenzen? – wimh

+1

Semantisch sollte das Aufteilen einer Kante in einem Diagramm (unabhängig davon, ob es gerichtet ist oder nicht) entweder diese Kante vollständig ungültig machen oder die gegebene Kante ändern, während eine neue Kante erstellt wird. Ich vermute, es liegt an OP, welches Verhalten gewählt wird. –

0

Es gibt zwei Möglichkeiten, das getan werden kann:

  1. find_edge kann einen &mut Bezug auf die Kante erzeugen. Dann wird split_edge am Ende den exklusiven Kredit in die Referenz übertragen, die es zurückgibt, so dass es für den Anrufer nicht zugänglich ist.

  2. find_edge kann stattdessen take_edge sein. Das heißt, es erzeugt ein nicht kopierbares Objekt, das die Kante darstellt. split_edge, natürlich, wird es verbrauchen.

Verwandte Themen