Ferrugem - Fatias

Uma fatia é um ponteiro para um bloco de memória. Fatias podem ser usadas para acessar porções de dados armazenados em blocos de memória contíguos. Ele pode ser usado com estruturas de dados como arrays, vetores e strings. As fatias usam números de índice para acessar partes dos dados. O tamanho de uma fatia é determinado no tempo de execução.

Fatias são indicadores dos dados reais. Eles são passados ​​por referência a funções, o que também é conhecido como empréstimo.

Por exemplo, fatias podem ser usadas para buscar uma parte de um valor de string. Uma string fatiada é um ponteiro para o objeto string real. Portanto, precisamos especificar o índice inicial e final de uma String. O índice começa em 0, assim como os arrays.

Sintaxe

let sliced_value = &data_structure[start_index..end_index]

O valor mínimo do índice é 0 e o valor máximo do índice é o tamanho da estrutura de dados. NOTE que end_index não será incluído na string final.

O diagrama abaixo mostra um exemplo de Tutoriais de string , que tem 9 caracteres. O índice do primeiro caractere é 0 e o do último caractere é 8.

O código a seguir busca 5 caracteres da string (começando no índice 4).

fn main() {
   let n1 = "Tutorials".to_string();
   println!("length of string is {}",n1.len());
   let c1 = &n1[4..9]; 
   
   // fetches characters at 4,5,6,7, and 8 indexes
   println!("{}",c1);
}

Resultado

length of string is 9
rials

Ilustração - Slicing an integer array

A função main () declara um array com 5 elementos. Invoca ouse_slice()função e passa para ela uma fatia de três elementos (aponta para a matriz de dados). As fatias são passadas por referência. A função use_slice () imprime o valor da fatia e seu comprimento.

fn main(){
   let data = [10,20,30,40,50];
   use_slice(&data[1..4]);
   //this is effectively borrowing elements for a while
}
fn use_slice(slice:&[i32]) { 
   // is taking a slice or borrowing a part of an array of i32s
   println!("length of slice is {:?}",slice.len());
   println!("{:?}",slice);
}

Resultado

length of slice is 3
[20, 30, 40]

Fatias mutáveis

o &mut A palavra-chave pode ser usada para marcar uma fatia como mutável.

fn main(){
   let mut data = [10,20,30,40,50];
   use_slice(&mut data[1..4]);
   // passes references of 
   20, 30 and 40
   println!("{:?}",data);
}
fn use_slice(slice:&mut [i32]) {
   println!("length of slice is {:?}",slice.len());
   println!("{:?}",slice);
   slice[0] = 1010; // replaces 20 with 1010
}

Resultado

length of slice is 3
[20, 30, 40]
[10, 1010, 30, 40, 50]

O código acima passa uma fatia mutável para a função use_slice () . A função modifica o segundo elemento da matriz original.