Rust-어레이

이 장에서는 어레이 및 이와 관련된 다양한 기능에 대해 알아 봅니다. 배열에 대해 배우기 전에 배열이 변수와 어떻게 다른지 살펴 보겠습니다.

변수에는 다음과 같은 제한이 있습니다.

  • 변수는 본질적으로 스칼라입니다. 즉, 변수 선언은 한 번에 하나의 값만 포함 할 수 있습니다. 이것은 프로그램에 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! () 함수 의 {:?} 구문은 배열의 모든 값을 인쇄하는 데 사용됩니다. 렌 () 함수는 상기 어레이의 크기를 계산하는 데 사용된다.

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 개 요소의 배열을 선언합니다. 데이터 유형은 변수 선언 중에 명시 적으로 지정되지 않습니다. 이 경우 배열은 정수 유형이됩니다. 렌 () 함수는 상기 어레이의 크기를 계산하는 데 사용된다.

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는 포인터 크기이므로 실제 크기는 프로그램을 컴파일하는 아키텍처에 따라 다릅니다.