Учебники

Rust — Array

В этой главе мы узнаем о массиве и различных функциях, связанных с ним. Прежде чем мы узнаем о массивах, давайте посмотрим, чем массив отличается от переменной.

Переменные имеют следующие ограничения —

  • Переменные имеют скалярный характер. Другими словами, объявление переменной может содержать только одно значение за раз. Это означает, что для хранения n значений в программе потребуется объявление переменных n. Следовательно, использование переменных неосуществимо, когда нужно хранить большую коллекцию значений.

  • Переменные в программе выделяются памяти в случайном порядке, что затрудняет получение / чтение значений в порядке их объявления.

Переменные имеют скалярный характер. Другими словами, объявление переменной может содержать только одно значение за раз. Это означает, что для хранения n значений в программе потребуется объявление переменных n. Следовательно, использование переменных неосуществимо, когда нужно хранить большую коллекцию значений.

Переменные в программе выделяются памяти в случайном порядке, что затрудняет получение / чтение значений в порядке их объявления.

Массив представляет собой однородную коллекцию значений. Проще говоря, массив — это набор значений одного и того же типа данных.

Особенности массива

Особенности массива перечислены ниже:

  • Объявление массива выделяет последовательные блоки памяти.

  • Массивы статичны. Это означает, что массив после инициализации не может быть изменен.

  • Каждый блок памяти представляет элемент массива.

  • Элементы массива идентифицируются уникальным целым числом, называемым индексом / индексом элемента.

  • Заполнение элементов массива называется инициализацией массива.

  • Значения элементов массива могут быть обновлены или изменены, но не могут быть удалены.

Объявление массива выделяет последовательные блоки памяти.

Массивы статичны. Это означает, что массив после инициализации не может быть изменен.

Каждый блок памяти представляет элемент массива.

Элементы массива идентифицируются уникальным целым числом, называемым индексом / индексом элемента.

Заполнение элементов массива называется инициализацией массива.

Значения элементов массива могут быть обновлены или изменены, но не могут быть удалены.

Объявление и инициализация массивов

Используйте синтаксис, приведенный ниже, чтобы объявить и инициализировать массив в Rust.

Синтаксис

//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];

В первом синтаксисе тип массива выводится из типа данных первого элемента массива во время инициализации.

Иллюстрация: Простой массив

В следующем примере явно указывается размер и тип данных массива. Синтаксис {:?} Функции println! () Используется для печати всех значений в массиве. Функция len () используется для вычисления размера массива.

fn main(){
   let arr:[i32;4] = [10,20,30,40];
   println!("array is {:?}",arr);
   println!("array size is :{}",arr.len());
}

Выход

array is [10, 20, 30, 40]
array size is :4

Иллюстрация: массив без типа данных

Следующая программа объявляет массив из 4 элементов. Тип данных не указывается явно во время объявления переменной. В этом случае массив будет иметь тип integer. Функция len () используется для вычисления размера массива.

fn main(){
   let arr = [10,20,30,40];
   println!("array is {:?}",arr);
   println!("array size is :{}",arr.len());
}

Выход

array is [10, 20, 30, 40]
array size is :4

Иллюстрация: значения по умолчанию

В следующем примере создается массив и инициализируются все его элементы со значением по умолчанию -1 .

fn main() {
   let arr:[i32;4] = [-1;4];
   println!("array is {:?}",arr);
   println!("array size is :{}",arr.len());
}

Выход

array is [-1, -1, -1, -1]
array size is :4

Иллюстрация: Массив с циклом for

В следующем примере выполняется перебор массива и выводятся индексы и их соответствующие значения. Цикл извлекает значения из индекса от 0 до 4 (индекс последнего элемента массива).

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]);
   }
}

Выход

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

Иллюстрация: использование функции iter ()

Функция iter () извлекает значения всех элементов в массиве.

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);
   }
}

Выход

array is [10, 20, 30, 40]
array size is :4
value is :10
value is :20
value is :30
value is :40

Иллюстрация: изменяемый массив

Ключевое слово mut может использоваться для объявления изменяемого массива. В следующем примере объявляется изменяемый массив и изменяется значение второго элемента массива.

fn main(){
   let mut arr:[i32;4] = [10,20,30,40];
   arr[1] = 0;
   println!("{:?}",arr);
}

Выход

[10, 0, 30, 40]

Передача массивов в качестве параметров в функции

Массив может быть передан по значению или по ссылке на функции.

Иллюстрация: передача по значению

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);
}

Выход

Inside update [0, 0, 0]
Inside main [10, 20, 30]

Иллюстрация: Передача по ссылке

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);
}

Выход

Inside update [0, 0, 0]
Inside main [0, 0, 0]

Декларация массива и константы

Давайте рассмотрим пример, приведенный ниже, чтобы понять объявление массива и константы.

fn main() {
   let N: usize = 20;
   let arr = [0; N]; //Error: non-constant used with constant
   print!("{}",arr[10])
}

Компилятор приведет к исключению. Это потому, что длина массива должна быть известна во время компиляции. Здесь значение переменной «N» будет определено во время выполнения. Другими словами, переменные не могут быть использованы для определения размера массива.

Тем не менее, следующая программа действительна —

fn main() {
   const N: usize = 20; 
   // pointer sized
   let arr = [0; N];

   print!("{}",arr[10])
}

Значение идентификатора с префиксом ключевого слова const определяется во время компиляции и не может быть изменено во время выполнения. usize имеет размер указателя, поэтому его фактический размер зависит от архитектуры, для которой вы компилируете программу.