2015-05-23 19 views
9

Một mảng cố định chiều dài của một loại có nguồn gốc (hoặc của một loại mà thực hiện các Copy đặc điểm) có thể được nhân bản vô tính ở Rust lên đến chiều dài của 32. Đó là, này biên dịch:Làm thế nào để sao chép một mảng có chiều dài lớn hơn 32?

fn main() { 
    let source: [i32; 32] = [0; 32]; // length 32 
    let _cloned = source.clone(); 
} 

Nhưng doesn này 't:

fn main() { 
    let source: [i32; 33] = [0; 33]; // length 33 
    let _cloned = source.clone(); // <-- compile error 
} 

trong thực tế, trait Clone chỉ tuyên bố một phương pháp cho mỗi chiều dài mảng chung, từ 0 đến 32.

là gì một cách hiệu quả và thành ngữ để sao chép một mảng chung của chiều dài, nói , 33?

+0

Có lý do nào khiến bạn không thể sử dụng 'Vec' trong trường hợp này không? – Shepmaster

+2

Đối với bất kỳ ai khác đi "WTF", [đây là triển khai] (https://github.com/rust-lang/rust/blob/1.0.0/src/libcore/array.rs#L41) – remram

Trả lời

7

Bạn không thể thêm impl Clone vào mã của riêng mình. Vấn đề này sẽ được cố định tại một số điểm, trong thời gian trung bình bạn chủ yếu có thể làm việc xung quanh nó với số lượng khác nhau của các nỗ lực:

  • Nếu bạn chỉ có một biến địa phương của một kiểu dữ liệu cụ và loại là Copy (như trong ví dụ của bạn), bạn có thể chỉ cần sao chép thay vì nhân bản, tức là, let _cloned = source;.
  • Nếu mảng là trường của cấu trúc bạn muốn triển khai Clone cho (và derive sẽ không hoạt động), bạn vẫn có thể thực hiện thủ công Clone và sử dụng mẹo ở trên trong quá trình triển khai.
  • Nhân bản một mảng không thuộc loại Copy là phức tạp hơn, vì Clone có thể không thành công. Bạn có thể viết ra [x[0].clone(), x[1].clone(), ...] cho bao nhiêu lần tùy ý, đó là rất nhiều công việc nhưng ít nhất nó chắc chắn là chính xác.
  • Nếu vẫn thất bại, bạn vẫn có thể tạo trình bao bọc newtype. Điều này đòi hỏi khá một chút của boilerplate để đại biểu tất cả các đặc điểm khác mà bạn cần, nhưng sau đó bạn có thể (một lần nữa, bằng tay) thực hiện Clone.
Các vấn đề liên quan