2014-10-03 15 views
9

Tôi cần phải khởi tạo từng phần tử của mảng thành biểu thức không liên tục. Tôi có thể làm điều đó mà không cần phải khởi tạo từng phần tử của mảng thành một số biểu thức vô nghĩa? Dưới đây là một ví dụ về những gì tôi muốn để có thể làm:Có cách nào để không phải khởi tạo mảng hai lần không?

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

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

Mã này cung cấp cho các lỗi thời gian biên dịch:

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` 

Để khắc phục vấn đề tôi cần phải thay đổi dòng đầu tiên của chức năng để khởi tạo các yếu tố của ys với một số giá trị giả như vậy:

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

có cách nào để bỏ qua mà thêm khởi? Gói tất cả mọi thứ trong một khối unsafe dường như không tạo ra bất kỳ sự khác biệt nào.

Trả lời

11

Sử dụng std::mem::uninitialized:

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

này là không an toàn vì truy cập vào các giá trị chưa được khởi tạo là hành vi không xác định trong Rust và trình biên dịch không còn có thể đảm bảo rằng tất cả các giá trị của ys sẽ được khởi tạo trước khi nó được đọc.

Bạn cannot collect into an array, nhưng nếu bạn đã có một Vec thay vào đó, bạn có thể làm:

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

Đối với vấn đề cụ thể của bạn, bạn cũng có thể sao chép các mảng đến và sau đó đột biến nó:

let mut ys = xs.clone(); 
for y in ys.iter_mut() { *y = *y/3 } 
Các vấn đề liên quan