Ferrugem - Array
Neste capítulo, aprenderemos sobre um array e os vários recursos associados a ele. Antes de aprendermos sobre arrays, vejamos como um array é diferente de uma variável.
As variáveis têm as seguintes limitações -
As variáveis são escalares por natureza. Em outras palavras, uma declaração de variável pode conter apenas um único valor por vez. Isso significa que, para armazenar n valores em um programa, será necessária a declaração de n variáveis. Portanto, o uso de variáveis não é viável quando se precisa armazenar uma coleção maior de valores.
As variáveis em um programa são alocadas na memória em ordem aleatória, dificultando a recuperação / leitura dos valores na ordem de sua declaração.
Uma matriz é uma coleção homogênea de valores. Simplificando, uma matriz é uma coleção de valores do mesmo tipo de dados.
Características de um Array
Os recursos de uma matriz estão listados abaixo -
Uma declaração de array aloca blocos de memória sequencial.
Matrizes são estáticas. Isso significa que uma matriz, uma vez inicializada, não pode ser redimensionada.
Cada bloco de memória representa um elemento do array.
Os elementos da matriz são identificados por um número inteiro único denominado subscrito / índice do elemento.
O preenchimento dos elementos da matriz é conhecido como inicialização da matriz.
Os valores dos elementos da matriz podem ser atualizados ou modificados, mas não podem ser excluídos.
Declarando e inicializando matrizes
Use a sintaxe fornecida a seguir para declarar e inicializar uma matriz em Rust.
Sintaxe
//Syntax1
let variable_name = [value1,value2,value3];
//Syntax2
let variable_name:[dataType;size] = [value1,value2,value3];
//Syntax3
let variable_name:[dataType;size] = [default_value_for_elements,size];
Na primeira sintaxe, o tipo da matriz é inferido do tipo de dados do primeiro elemento da matriz durante a inicialização.
Ilustração: Array Simples
O exemplo a seguir especifica explicitamente o tamanho e o tipo de dados da matriz. A sintaxe {:?} Da função println! () É usada para imprimir todos os valores na matriz. A função len () é usada para calcular o tamanho do array.
fn main(){
let arr:[i32;4] = [10,20,30,40];
println!("array is {:?}",arr);
println!("array size is :{}",arr.len());
}
Resultado
array is [10, 20, 30, 40]
array size is :4
Ilustração: Array sem tipo de dados
O programa a seguir declara uma matriz de 4 elementos. O tipo de dados não é especificado explicitamente durante a declaração da variável. Nesse caso, a matriz será do tipo inteiro. A função len () é usada para calcular o tamanho do array.
fn main(){
let arr = [10,20,30,40];
println!("array is {:?}",arr);
println!("array size is :{}",arr.len());
}
Resultado
array is [10, 20, 30, 40]
array size is :4
Ilustração: valores padrão
O exemplo a seguir cria uma matriz e inicializa todos os seus elementos com um valor padrão de -1 .
fn main() {
let arr:[i32;4] = [-1;4];
println!("array is {:?}",arr);
println!("array size is :{}",arr.len());
}
Resultado
array is [-1, -1, -1, -1]
array size is :4
Ilustração: Array com for loop
O exemplo a seguir itera por meio de uma matriz e imprime os índices e seus valores correspondentes. O loop recupera valores do índice 0 a 4 (índice do último elemento da matriz).
fn main(){
let arr:[i32;4] = [10,20,30,40];
println!("array is {:?}",arr);
println!("array size is :{}",arr.len());
for index in 0..4 {
println!("index is: {} & value is : {}",index,arr[index]);
}
}
Resultado
array is [10, 20, 30, 40]
array size is :4
index is: 0 & value is : 10
index is: 1 & value is : 20
index is: 2 & value is : 30
index is: 3 & value is : 40
Ilustração: Usando a função iter ()
A função iter () busca valores de todos os elementos em uma matriz.
fn main(){
let arr:[i32;4] = [10,20,30,40];
println!("array is {:?}",arr);
println!("array size is :{}",arr.len());
for val in arr.iter(){
println!("value is :{}",val);
}
}
Resultado
array is [10, 20, 30, 40]
array size is :4
value is :10
value is :20
value is :30
value is :40
Ilustração: array mutável
A palavra-chave mut pode ser usada para declarar um array mutável. O exemplo a seguir declara uma matriz mutável e modifica o valor do segundo elemento da matriz.
fn main(){
let mut arr:[i32;4] = [10,20,30,40];
arr[1] = 0;
println!("{:?}",arr);
}
Resultado
[10, 0, 30, 40]
Passando Arrays como Parâmetros para Funções
Uma matriz pode ser passada por valor ou por referência a funções.
Ilustração: Passar por valor
fn main() {
let arr = [10,20,30];
update(arr);
print!("Inside main {:?}",arr);
}
fn update(mut arr:[i32;3]){
for i in 0..3 {
arr[i] = 0;
}
println!("Inside update {:?}",arr);
}
Resultado
Inside update [0, 0, 0]
Inside main [10, 20, 30]
Ilustração: passagem por referência
fn main() {
let mut arr = [10,20,30];
update(&mut arr);
print!("Inside main {:?}",arr);
}
fn update(arr:&mut [i32;3]){
for i in 0..3 {
arr[i] = 0;
}
println!("Inside update {:?}",arr);
}
Resultado
Inside update [0, 0, 0]
Inside main [0, 0, 0]
Declaração e constantes de array
Vamos considerar um exemplo fornecido a seguir para entender a declaração e as constantes do array.
fn main() {
let N: usize = 20;
let arr = [0; N]; //Error: non-constant used with constant
print!("{}",arr[10])
}
O compilador resultará em uma exceção. Isso ocorre porque o comprimento de um array deve ser conhecido em tempo de compilação. Aqui, o valor da variável "N" será determinado em tempo de execução. Em outras palavras, as variáveis não podem ser usadas para definir o tamanho de um array.
No entanto, o seguinte programa é válido -
fn main() {
const N: usize = 20;
// pointer sized
let arr = [0; N];
print!("{}",arr[10])
}
O valor de um identificador prefixado com a palavra-chave const é definido em tempo de compilação e não pode ser alterado em tempo de execução. usize tem o tamanho de um ponteiro, portanto, seu tamanho real depende da arquitetura para a qual você está compilando seu programa.