Rust hat ein Build- und Dependency Managementsystem. Yay.
Heißt `cargo`.
Mit `cargo build` kann man Programme bauen.
-Im Falle dieses Repos baut das nur die Basislib und noch keine Executable, dazu dann z.B. `cargo build --bin example`.
+Im Falle dieses Repos baut das nur die Basislib und noch keine Executable, dazu dann z.B. `cargo build --bin example` oder statt example ein anderes Programm wie `decode_vector`.
Mit `cargo run` kann man bauen und direkt ausführen.
Argumente an das Programm kommen nach einem `--`.
Sobald die Performance interessant ist unbedingt `cargo run --release` nutzen - das ist ungefähr was `-O3` bei C++ ist.
Rust hat einen exzellenten Linter, der einem sehr hilft idiomatischen und performanten Code zu schreiben.
Das ist insbesondere wenn man noch nicht viel Erfahrung mit der Sprache hat extrem sinnvoll!
-Installieren kann man Clippy mit `rustup component add clippy-preview`.
+Installieren kann man Clippy mit `rustup component add clippy`.
Anstatt `cargo check` ruft man dann `cargo clippy` auf und kann sich auf viel hilfreiches Feedback freuen.
# Rust Routenplanungs-Basis-Framework
Das kann z.B. so aussehen:
```Rust
-extern crate stud_rust_base;
use stud_rust_base::io::*;
-let head = Vec::<u32>::load_from("head_file_name").expect("could not read head");
-let lat = Vec::<f32>::load_from("node_latitude_file_name").expect("could not read lat");
-head.write_to("output_file").expect("could not write head");
+let head = Vec::<u32>::load_from("head_file_name")?;
+let lat = Vec::<f32>::load_from("node_latitude_file_name")?;
+head.write_to(&"output_file")?;
```
Die Dateien in `src/bin/` sind einmal ein Beispielprogramm sowieso Hilfsprogramme.
Das Programm `compare_vector` vergleicht ob zwei Vektoren identisch sind und wenn sie es nicht sind gibt es eine Übersicht über die Unterschiede.
Fügen sie Ihre Programme in `src/bin/` hinzu, diese werden dann von `cargo` automatisch gefunden.
+## Docs
+
+`cargo doc --open` öffnet die Dokumentation zu dem bereitgestelltem Code.
+
## Graphen
Knoten und Kanten werden durch numerische IDs identifiziert, die von `0` bis `n-1` bzw. `m-1` gehen, wobei `n` die Anzahl an Knoten und `m` die Anzahl an gerichteten Kanten ist.
Um über die ausgehenden Kanten eines Knoten zu iterieren können Sie den folgenden Code verwenden:
```Rust
-extern crate stud_rust_base;
use stud_rust_base::{types::*, io::*};
-let first_out = Vec::<EdgeId>::load_from("first_out_file_name").expect("could not read first_out");
-let head = Vec::<NodeId>::load_from("head_file_name").expect("could not read head");
-let travel_time = Vec::<Weight>::load_from("weight_file_name").expect("could not read travel_time");
+let first_out = Vec::<EdgeId>::load_from("first_out_file_name")?;
+let head = Vec::<NodeId>::load_from("head_file_name")?;
+let travel_time = Vec::<Weight>::load_from("weight_file_name")?;
let node_id = 42;
-for edge_id in head[first_out[node_id] as usize .. first_out[node_id + 1] as usize] {
+for edge_id in first_out[node_id] .. first_out[node_id + 1] {
println!("There is an arc from {} to {} with weight {}", node_id, head[edge_id as usize], travel_time[edge_id as usize]);
}
```
## Hinweise zur Nutzung im Routenplanungspraktikum
-Der Quellcode soll durch das Ausführen von `cargo build --all` mit dem aktuellen stabilen Compiler (1.29.2) übersetzt werden können.
+Der Quellcode soll durch das Ausführen von `cargo build --all` mit dem aktuellen stabilen Compiler (1.38.0) übersetzt werden können.
Auf den Poolraumrechner ist kein Rust Compiler vorinstalliert.
Sie können aber für ihren Nutzer lokal `rustup` und damit dann einen aktuellen Compiler installieren.
Die Nutzung von nicht stabilen nightly Features ist nicht erlaubt.
Das verwenden externer crates ist nicht erlaubt.
-Die Rust-Standardbibliothek ist nicht extern.
+Die Rust-Standardbibliothek gilt nicht als extern.