let v: Vec<i32> = Vec::new();
벡터에 어떠한 값도 집어넣지 않았기 때문에 저장하고자하는 요소의 타입을 명시해주어야 합니다.
Rust는 vec!
매크로를 제공합니다. vec!
은 초기값들을 저장하고있는 새로운 Vec
을 생성합니다.
let v = vec![1, 2, 3];
push
let mut v = Vec::new();
v.push(5);
v.push(6);
v.push(7);
v.push(8);
struct
와 마찬가지로 Vec
또한 스코프 밖으로 벗어날 때 해제됩니다
{
let v = vec![1, 2, 3, 4];
// somthing...
} // <- v가 스코프 밖으로 벗어났고, 여기서 해제됩니다
백터가 드롭될 때 내용물 또한 전부 드롭됩니다. 벡터가 가지고 있는 정수들이 모두 제거됩니다.
벡터 내에 저장된 값을 참조하는 방법에는 인덱스 문법 사용과 get
메소드 사용이 있습니다.
let v = vec![1, 2, 3, 4, 5];
let third: &i32 = &v[2];
let third: Option<&i32> = v.get(2);
벡터 요소를 참조하는 두가지 방법을 제공하는 이유는 벡터가 가지고 있지 않은 인덱스값을 사용하고자 했을 때 프로그램이 어떻게 동작할 것인지 선택할 수 있도록 하기 위함입니다.
let v = vec![1, 2, 3, 4, 5];
let does_not_exist = &v[100];
let does_not_exist = v.get(100);
위 코드 실행 시, []
메소드는 존재하지 않는 요소를 참조하기 때문에 panic!
을 일으킵니다. 프로그램이 벡터의 끝을 넘어서는 요소에 접근하는 시도를 하면 프로그램이 죽게끔 의도하는 경우에 가장 좋습니다.
get
메소드는 패닉없이 None
이 반환됩니다. 일반적인 환경에서 벡터 범위 밖의 요소에 접근하는 것이 종종 발생한다면 해당 방법이 좋습니다.
같은 스코프 내에서 가변 참조자와 불변 참조자를 함께 가질 수 없음을 기억해야합니다. 아래의 코드와 같은 상황은 에러가 발생합니다.
let mut v = vec![1, 2, 3, 4, 5];
let first = &v[0];
v.push(6);
error[E0502]: cannot borrow `v` as mutable because it is also
borrowed asimmutable
|
4 | let first = &v[0];
| - immutable borrow occurs here
5 |
6 | v.push(6);
| ^ mutable borrow occurs here
7 | }
| - immutable borrow ends here
let v = vec![100, 32, 57];
for i in &v {
println!("{}", i);
}
let mut v = vec![100, 32, 57];
for i in &mut v {
*i += 50;
}
벡터는 같은 타입을 가진 값들만 저장할 수 있지만, 다른 타입의 값들에 대한 리스트를 저장해야할 때가 있습니다. 열거형의 variant는 같은 열거형 타입 내에 정의가 되므로 열거형을 사용해 벡터 내에 여러 타입을 저장할 수 있습니다.
enum SpreadsheetCell {
Int(i32),
Float(f64),
Text(String),
}
let row = vec![
SpreadsheetCell::Int(3),
SpreadsheetCell::Text(String::from("blue")),
SpreadsheetCell::Float(10.12),
];
Rust가 컴파일 타임에 벡터 내에 저장될 타입을 알아야하는 이유는 각 요소를 저장하기 위해 필요한 힙 메모리를 알기 위함입니다.