2014-10-03 7 views
9

배열의 각 요소를 상수가 아닌 식으로 초기화해야합니다. 배열의 각 요소를 먼저 무의미한 식으로 초기화 할 필요없이 할 수 있습니까?배열을 두 번 초기화 할 필요가없는 방법이 있습니까?

fn foo(xs: &[i32; 1000]) { 
    let mut ys: [i32; 1000]; 

    for (x, y) in xs.iter().zip(ys.iter_mut()) { 
     *y = *x/3; 
    } 
    // ... 
} 

이 코드를 컴파일 타임 오류가 제공합니다 :

error[E0381]: use of possibly uninitialized variable: `ys` 
--> src/main.rs:5:37 
    | 
5 |   for (x, y) in xs.iter().zip(ys.iter_mut()) { 
    |          ^^ use of possibly uninitialized `ys` 

내가의 첫 번째 줄을 변경해야하는 문제를 해결하기 위해 여기에 내가 할 수 있도록하고 싶습니다 무엇의 예 함수는 이렇게 같은 몇 가지 더미 값으로 ys의 요소를 초기화 : 여분의 초기화를 생략 할 수있는 방법이

let mut ys: [i32; 1000] = [0; 1000]; 

있습니까? unsafe 블록의 모든 것을 래핑해도 아무런 차이가없는 것처럼 보입니다.

답변

11

사용 std::mem::uninitialized :

let mut ys: [i32; 1000] = unsafe { std::mem::uninitialized() }; 

초기화되지 않은 값에 액세스하는 녹에서 정의되지 않은 동작이 컴파일러는 더 이상 읽기 전에 ys의 모든 값이 초기화 될 것이라고 보장 할 수 있기 때문에 안전하지 않은 것입니다.

당신에게 cannot collect into an array을하지만, 대신 Vec가 있다면, 당신은 할 수 :

let mut ys = xs.clone(); 
for y in ys.iter_mut() { *y = *y/3 } 
:

let ys: Vec<_> = xs.iter().map(|&x| x/3).collect(); 

를 특정 문제를 들어, 당신은 또한 그것을 돌연변이 다음 들어오는 배열을 복제하고 수