Rust - Tipi di dati
Il Type System rappresenta i diversi tipi di valori supportati dalla lingua. Il Type System verifica la validità dei valori forniti, prima che vengano memorizzati o manipolati dal programma. Ciò garantisce che il codice si comporti come previsto. Il Type System consente inoltre suggerimenti più ricchi sul codice e documentazione automatizzata.
Rust è un linguaggio tipizzato staticamente. Ogni valore in Rust è di un certo tipo di dati. Il compilatore può dedurre automaticamente il tipo di dati della variabile in base al valore ad essa assegnato.
Dichiara una variabile
Utilizzare il let parola chiave per dichiarare una variabile.
fn main() {
let company_string = "TutorialsPoint"; // string type
let rating_float = 4.5; // float type
let is_growing_boolean = true; // boolean type
let icon_char = '♥'; //unicode character type
println!("company name is:{}",company_string);
println!("company rating on 5 is:{}",rating_float);
println!("company is growing :{}",is_growing_boolean);
println!("company icon is:{}",icon_char);
}
Nell'esempio precedente, il tipo di dati delle variabili verrà dedotto dai valori loro assegnati. Ad esempio, Rust assegnerà il tipo di dati stringa alla variabile company_string , il tipo di dati float a rating_float , ecc.
Il println! macro richiede due argomenti:
- Una sintassi speciale {} , che è il segnaposto
- Il nome della variabile o una costante
Il segnaposto verrà sostituito dal valore della variabile
L'output dello snippet di codice sopra sarà:
company name is: TutorialsPoint
company rating on 5 is:4.5
company is growing: true
company icon is: ♥
Tipi scalari
Un tipo scalare rappresenta un singolo valore. Ad esempio, 10,3.14, "c". Rust ha quattro tipi di scalari primari.
- Integer
- Floating-point
- Booleans
- Characters
Impareremo a conoscere ogni tipo nelle nostre sezioni successive.
Numero intero
Un numero intero è un numero senza una componente frazionaria. In poche parole, il tipo di dati intero viene utilizzato per rappresentare i numeri interi.
I numeri interi possono essere ulteriormente classificati come con segno e senza segno. Gli interi con segno possono memorizzare valori sia negativi che positivi. Gli interi senza segno possono memorizzare solo valori positivi. Una descrizione dettagliata se i tipi interi è fornita di seguito:
Sr.No. | Taglia | Firmato | Non firmato |
---|---|---|---|
1 | 8 bit | i8 | u8 |
2 | 16 bit | i16 | u16 |
3 | 32 bit | i32 | u32 |
4 | 64 bit | i64 | u64 |
5 | 128 bit | i128 | u128 |
6 | Arco | isize | usize |
La dimensione di un numero intero può essere arch . Ciò significa che la dimensione del tipo di dati sarà derivata dall'architettura della macchina. Un numero intero la cui dimensione è arch sarà di 32 bit su una macchina x86 e 64 bit su una macchina x64. Un intero arch viene utilizzato principalmente durante l'indicizzazione di una sorta di raccolta.
Illustrazione
fn main() {
let result = 10; // i32 by default
let age:u32 = 20;
let sum:i32 = 5-15;
let mark:isize = 10;
let count:usize = 30;
println!("result value is {}",result);
println!("sum is {} and age is {}",sum,age);
println!("mark is {} and count is {}",mark,count);
}
L'output sarà come indicato di seguito:
result value is 10
sum is -10 and age is 20
mark is 10 and count is 30
Il codice precedente restituirà un errore di compilazione se si sostituisce il valore di età con un valore a virgola mobile.
Intervallo intero
Ogni variante con segno può memorizzare numeri da - (2 ^ (n-1) a 2 ^ (n-1) -1 , dove n è il numero di bit utilizzati dalla variante. Ad esempio, i8 può memorizzare numeri da - (2 ^ 7) a 2 ^ 7-1 - qui abbiamo sostituito n con 8.
Ogni variante senza segno può memorizzare numeri da 0 a (2 ^ n) -1 . Ad esempio, u8 può memorizzare numeri da 0 a 2 ^ 7 , che è uguale a 0 a 255.
Overflow di numeri interi
Un integer overflow si verifica quando il valore assegnato a una variabile intera supera l'intervallo definito da Rust per il tipo di dati. Facci capire questo con un esempio:
fn main() {
let age:u8 = 255;
// 0 to 255 only allowed for u8
let weight:u8 = 256; //overflow value is 0
let height:u8 = 257; //overflow value is 1
let score:u8 = 258; //overflow value is 2
println!("age is {} ",age);
println!("weight is {}",weight);
println!("height is {}",height);
println!("score is {}",score);
}
L'intervallo valido della variabile u8 senza segno è compreso tra 0 e 255. Nell'esempio precedente, alle variabili vengono assegnati valori maggiori di 255 (limite superiore per una variabile intera in Rust). All'esecuzione, il codice sopra restituirà un avviso:warning − literal out of range for u8per le variabili peso, altezza e punteggio. I valori di overflow dopo 255 inizieranno da 0, 1, 2, ecc. L'output finale senza preavviso è come mostrato di seguito -
age is 255
weight is 0
height is 1
score is 2
Galleggiante
Il tipo di dati Float in Rust può essere classificato come f32 e f64. Il tipo f32 è un float a precisione singola e f64 ha una precisione doppia. Il tipo predefinito è f64. Considera il seguente esempio per comprendere meglio il tipo di dati float.
fn main() {
let result = 10.00; //f64 by default
let interest:f32 = 8.35;
let cost:f64 = 15000.600; //double precision
println!("result value is {}",result);
println!("interest is {}",interest);
println!("cost is {}",cost);
}
L'output sarà come mostrato di seguito:
interest is 8.35
cost is 15000.6
Casting automatico del tipo
Il casting automatico del tipo non è consentito in Rust. Considera il seguente frammento di codice. Un valore intero viene assegnato alla variabile floatinterest.
fn main() {
let interest:f32 = 8; // integer assigned to float variable
println!("interest is {}",interest);
}
Il compilatore lancia un file mismatched types error come indicato di seguito.
error[E0308]: mismatched types
--> main.rs:2:22
|
2 | let interest:f32=8;
| ^ expected f32, found integral variable
|
= note: expected type `f32`
found type `{integer}`
error: aborting due to previous error(s)
Separatore di numeri
Per una facile leggibilità di numeri grandi, possiamo utilizzare un separatore visivo _ trattino basso per separare le cifre. Cioè 50.000 può essere scritto come 50_000. Questo è mostrato nell'esempio seguente.
fn main() {
let float_with_separator = 11_000.555_001;
println!("float value {}",float_with_separator);
let int_with_separator = 50_000;
println!("int value {}",int_with_separator);
}
L'output è fornito di seguito:
float value 11000.555001
int value 50000
Booleano
I tipi booleani hanno due possibili valori: vero o falso . Utilizzare ilbool parola chiave per dichiarare una variabile booleana.
Illustrazione
fn main() {
let isfun:bool = true;
println!("Is Rust Programming Fun ? {}",isfun);
}
L'output del codice precedente sarà:
Is Rust Programming Fun ? true
Personaggio
Il tipo di dati carattere in Rust supporta numeri, alfabeti, Unicode e caratteri speciali. Utilizzare ilcharparola chiave per dichiarare una variabile del tipo di dati carattere. Il tipo char di Rust rappresenta un valore scalare Unicode, il che significa che può rappresentare molto di più del semplice ASCII. I valori scalari Unicode vanno daU+0000 per U+D7FF e U+E000 per U+10FFFF compreso.
Consideriamo un esempio per capire di più sul tipo di dati Character.
fn main() {
let special_character = '@'; //default
let alphabet:char = 'A';
let emoji:char = '';
println!("special character is {}",special_character);
println!("alphabet is {}",alphabet);
println!("emoji is {}",emoji);
}
L'output del codice precedente sarà:
special character is @
alphabet is A
emoji is