Create

let v: Vec<i32> = Vec::new();
let v = vec![1, 2, 3];
  • i32 값들을 제공했기 때문에, 러스트는 v가 Vec<i32> 타입이라는 것을 유추할 수 있다.

Push

let mut v = Vec::new();
v.push(1);
v.push(2);
v.push(3);
v.push(4);
  • 반대로 pop 메소드가 있다.

Drop

{
    let v = vec![1, 2, 3, 4];
}
// v가 스코프 밖으로 벗어나기 때문에 해제drop.
  • 벡터가 드롭될 때 벡터의 내용물은 전부 드롭된다.

Get

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]; // panic!
let does_not_exist = v.get(100); // None

Borrow

let mut v = vec![1, 2, 3, 4, 5];
let first = &v[0];
v.push(6);
  • 이 코드는 에러가 발생한다. 왜일까?
  • 벡터의 끝에 새로운 요소가 추가되는데 왜 첫번째 참조를 걱정해야 하는가?
  • 벡터의 크기가 커지면 새로운 메모리를 할당하고 새 공간으로 복사하는 경우가 있을 수 있다. 이렇게 되면, 첫번째 요소에 대한 참조자는 해제된 메모리를 가리키게 될 수 있다.
  • 이러한 경우를 피하기 위해, Rust는 같은 스코프 내에서 가변 참조자와 불변 참조자를 가질 수 없다.

For in Vector

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

여러 타입을 저장하기

enum SpreadsheetCell {
    Int(i32),
    Float(f64),
    Text(string),
}

let row = vec![
    SpreadsheetCell::Int(3),
    SpreadsheetCell::Text(String::from("blue")),
    SpreadsheetCell::Float(10.12),
];
  • 열거형을 이용하면 가능하다.

참고자료