Vannak előjeles és nélküli integer(egész) típusok, int és uint, ezeknek 8,16,32,64 bites variánsai, i8, u16, stb. Megadhatjuk őket 2,8,10,16 számrendszerben is. Minden integrál típusnak van suffix literálja, amiből kikövetkeztethető a típusa: i → int, u → uint stb. Ha nem adunk meg ilyen suffixeket a fordító kikövetkezteti, hogy milyen integer típusú, a típusinformációkból és függvény szignatúrákból a program környező részein. Ha nincs semmilyen információja akkor a típusa int lesz.
Lebegő pontos számokból két változat áll rendelkezésünkre: f32 és f64. A lebegőpontos számokat 0.0, 1e6 vagy 2.1e-4 formában adhatjuk meg. Az integerekhez hasonlóan a suffix literálból lehet következtetni a pontos típusra: f32 és f64 használható suffixnek.
Továbbá van még bool típus is, értékei lehetnek: true és false.
Karatertípus, char, 4 bájtos Unicode, amely literáljait aposztróf közé írjuk: 'x'. Hasonlóan, mint C-ben kezeli az escape karaktereket: \n\t\r.
Van még egy unit típus, amit () adhatunk meg, egy értéke van (nil): ().
A strukúrákat definiálni kell használat előtt, szintaxis:
Létrehozásnál elhagyjuk a struct kulcsszót:
„Inherited mutability” tulajdonsággal rendelkeznek(örökölt változtathatóság), vagyis az adattagjai megváltoztathatóak ha a struct-ot úgy adtuk meg a deklarációban. A adattagokra a név.tag formában hivakozunk.
Mintaillesztésben is megengedett a használatuk:
Ekkor a neveket nem kell a megadás sorrendjében felsorolni, sőt ha vannak olyanok amiket nem illesztünk akkor azok elhagyhatóak, ekkor a végére kell még egy „,..” rész.
Adattípusok melyeknek, több alternatív reprezentációja van.
Ennek a típusnak a lehetséges értékei, Circle: ami tartalmaz egy Point és f64 típust, illetve Rectangle, ami két Point-t tartalmaz. A futás idejű reprezentációjuk egy azonosítója az aktuális alaknak, hasonlóan a C-beli „tagged union” mintához. Létrehozás:
Paraméter nélküli enum:
Ekkor North, East, South, West konstansok, melyek típusai Direction. C-hez hasonlóan lehetőség van megkülönböztető értékekkel ellátni az enum elemeit. Ha egy elemhez nem adunk meg akkor annak az értéke az előző +1. Az első alapértelmezetten 0. Az as operátorral lehetséges egy enum elemét int-re konvertálni.
Az elemek konstruktorai felhasználhatóak mintaillesztésben is:
Az elemei lehetnek struct-ok is:
Hasonlóak a struct-okhoz, kivéve hogy a tagjainak nincsenek nevei vagyis nem férhetünk hozzájuk a „.” operátorral. Lehet akármekkora az aritásuk kivéve 0.
A struct-ok és tuple-k keveréke. Rendelkezik névvel, de a mezőinek nincsenek nevük(a struct-oknál van), pl.: Foo(1,2) nem egyenlő Bar(1,2).
Speciális eset amikor egy mező van, ekkor egy új típus jön létre a reprezentációja megegyezik azzal amiből létrejött de nem ekvivalensek.
Rust-ban több fajta mutató típus van, amiknek különböző tulajdonságaik vannak:
A legegyszerűbb mutató típus, csak egy mutathat egy memória területre A fordító a memória kezeléshez, statikus analízist végez a mutatókon, hogy eldöntse mikor kerülnek hatáskörbe és mikor hagyják el azt.
Az utolsó verzióban ez már deprecated, helyette az Rc és Gc mutatók használatosak. Rc: referencia számlálós. Több managed pointer is mutathat azonos memória területre, de az csak akkor szabadul majd fel, ha már egy sem mutat rá. Gc: aktiválja a Rust Garbage collectort.
A többivel ellentétben nem birtokolja az objektumot, csak mutat rá. Freezing: Amikor egy nem változtatható referenciát adunk értékül akkor a értékül adott objektum nem változtatható amíg vissza nem kapjuk. Itt x nem használható amíg y érvényben van:
Minden mutatót a * operátorral dereferálhatunk. A változtatható mutatóknál, a dereferált mutató állhat az értékadás bal oldalán. A precedenciája kisebb, mint a .-nak A . és [] operátorok automatikusan defereferálnak akár milyen mélyen
A Rust alapértelmezetten shallow copy-t alkalmaz a paraméterátadásra, értékadáshoz és függvények visszatérési értékénél. Move: Ha egy olyan objektumot másolunk, amelyik rendelkezik destruktorral, akkor másolásnál az objektum tulajdonjoga is tovább adódik és a másolt objektumot nem tudjuk használni amíg újra nem inicializáljuk. Ennek elkerülésére használható a Clone. A „Clone” metódust a Clone „trait” biztosítja.
A vektor egy a memóriában folytonosan elhelyezkedő 0-t vagy azonos típusú elemeket tartalmazó típus. Továbbá támogatva van a vektor mutatók is, amelyeket „slice”-nak hívnak. Az elemekre a [] operátorral lehet hivatkozni. Továbbá számos funkcióval rendelkeznek, mint push, remove stb.
A string-eket u8 elemek vektoraként reprezentáljuk Rust-ban, és garantálva van, hogy egy érvényes UTF-8 sorozat.
A fix méretű vektorok „unboxed”, az értékek közvetlenül tárolódnak benne, az elemszám része a típusnak. Tehát ha vektor változtatható akkor az elemei is. Fix méretű stringek nem léteznek.
A „unique” vektorok dinamikusan méretezhetőek, és van egy destruktoruk ami majd felszabadítja az általuk lefoglalt memóriát. Az elemeket közvetlenül tartalmazza, tehát a változtathatóság, mint előbb.
A „slice”-ok hasonlók a fix méretű vektorokhoz, de a méretük nem része a típusnak. Egyszerűen mutatókat tartalmaznak elemekre, nem birtokolják a tartalmazott elemeket.
Változtatható „slices”-ok is vannak, ekkor az elemeket kell változtathatóként megadni.
A let kulcsszó egy lokális változót vezet be, ekkor alapértelmezetett konstansok. Ahhoz, hogy később tudjuk változtatni a mut kulcsszót kell használni.
A lokális változók típusát a fordító kikövetkezteti, de ha akarjuk megadható a let név: típusnév formában. Definiálhatunk statikus változókat is ekkor kötelező megadnia típust.
A változóknál itt is van elfedés(shadowing), a második monster_size elfedi az elsőt, attól függetlenül, hogy az első típusa f64 a másodiké pedig int. Ennél a kódnál „unused variable” warningot kapunk, ennek elkerülésére, ha a változók nevét _-al kezdjük akkor nem ad rá ilyen warning-ot a fordító akkor sem ha kellene.
Jelentősebb különbség a szintaxisban a C-hez képest, hogy több konstrukció ami utasítás C-ben, az kifejezés Rust-ban, hogy tömörebb kódot írhassunk.
A blokkokban nincs pontosvessző, mert a blokkok utolsó kifejezésének értéke lesz a blokk értéke. Ez használható több helyen ahol, nem deklarációt adunk meg (let, fn, stb.), hanem egy kifejezést, például függvény törzset.
Az utolsó kifejezés értéke lesz a függvény visszatérési értéke.
Az operátoroknál kevés újdonság van. Aritmetikus operátorok *, /, %, +, -. Bitszintű operátorok, mint C-ben <<, >>, &, |, ^, !(not). Összehasonlító operátorok ==, !=, >, <, >=, <=. Lusta kiértékelésű bool operátorok && és ||. A fordítási idejű castolásokhoz használható az as operator. Bal oldalon egy kifejezést vár és jobb oldalon egy típust, ha lehetséges akkor a kifejezés értékét konvertálja a jobb oldalon megadottra. Általában a primitív numerikus típusokra és mutatókra szokás alkalmazni. Ez nem felüldefiniálható. Az operátorok precedenciája, mint C-ben. Továbbá transmute hasznáható nem biztonságos C-szerű castolásokhoz azonos méretű típusokon.