Pleteš si pojmy. Staticky znamená v době překladu. Ten příklad s Vect se taky ověřuje v době překladu, ale ten typový parametr pro délku vektoru nemusí být v době překladu znám. Rust a C++ pro to nemají formální prostředky, ale jiné jazyky to prostě umí (a nemusí mít GC ani runtime, to s tím vůbec nesouvisí).
Ne, nepletu, ano, přesně takhle jsem to myslel.
S runtimem i GC to souvisí, protože aby tvůj příklad fungoval, musí runtime jazyka být schopen za běhu instanciovat generický typ, vytvořit hodnotu takovéhu typu, dispatchovat na ní operace a nakonec být schopen tu hodnotu zase uvolnit. Něco takového vytvořit pro C++ a Rust je úplně jiná káva než v managed jazyku, to už by bylo mnohem jednodušší to udělat v Javě (koneckonců, odtud Scala).
A ještě jednou pro ty pomalejší, borrowing ani GC nijak nesouvisí s typovým systémem.
WTF? Borrowing v Rustu je implementován typovým systémem. Nebo jak si myslíš, že to funguje? Co přesně ti není jasné na tom, že fn foo(bar: &Bar) je syntax sugar pro generickou funkci foo<'a>(bar: &'a Bar) , kde 'a je typový parametr?
EDIT: Ještě jinak. V následujícím kódu
struct Foo<'a>(&'a str);
fn main() {
let text = String::from("hello");
let foo1 = Foo("hello");
let foo2 = Foo(text.as_str());
}
jsou foo1 a foo2 hodnoty různých typů. Typ foo1 je subtype typu foo2.