Generyki w Ruście działają ramię w ramię z cechami. Kiedy opisujemy sparametryzowany typ T, możemy ograniczyć, jakie typy mogą zostać użyte jako argument, wymieniając jakie cechy musi implementować taki argument.
W tym przykładzie typ T musi implementować cechę Foo:
fn my_function<T>(foo: T)
where
T:Foo
{
...
}
Używając generyków tworzymy statycznie otypowane funkcje w czasie kompilacji, które będą miały znane typy i rozmiary, pozwalając nam na wykonanie wywoływania statycznego i przechowywanie ich jako wartości o znanym rozmiarze.