You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2.0 KiB
2.0 KiB
+++ title = "Rust" description = "Základy" date = 2021-01-21 draft = false slug = "rust-bases"
[taxonomies] categories = ["programování"] tags = ["rust"] +++
Univerzální jazyk. Lze použít jako nízkoúrovňový i pro webový backend. Kompiluje se do nativní staticky linkované binárky. Klade důraz na bezpečnost, takže je těžší udělat memory leak, nebo data race condition ve vícevláknové aplikaci. Nemá garbage collector, memory management je řešen přes systém vlastnictví a zápujček.
fn main() {
println!("ahoj");
}
Memory management
- každá hodnota má proměnnou, která je vlastníkem hodnoty
- hodnota má pouze jednoho vlastníka
- se zánikem vlastníka, zaniká hodnota
{
let a = String::from("pokus"); // proměnná a je vlastníkem stringu "pokus"
let b = a; // teď je vlastníkem proměnná b, proměnnou a už nelze dál použít
} // string "pokus" je odstraněn z paměti
Hodnoty se do funkcí dají buď přesunout, nebo předat referencí. V Rustu se tomu říká zápujčka.
struct St {
prop: String;
}
fn funkce(a: String, b: &str, c: &St) {
...
}
fn main() {
let pok = String::from("pokus");
let pok1 = "pokus1";
let stru = St {
prop: String::from("prop"),
};
funkce(pok, pok1, &stru);
//pok je přesunuto, už nelze dál použít
//pok1 je reference na řetězec, předává se referencí, lze dál používat. Při volání se
//před pok1 nepíše &, protože to je reference už od začátku.
//stru je instance struktury St, funkce očekává referenci, takže při volání musíme
//napsat &stru
}
Platnost referencí hlídá borrow checker při kompilaci. Pokud je reference použitá za koncem platnosti, program nelze přeložit.
{
let r;
{
let x = 5;
r = &x; //nelze, protože platnost x končí s koncem bloku
}
println!("r: {}", r); //neplatná reference, nepůjde přeložit.
}