2015-05-23 14 views
9

doğal tipte bir sabit uzunluklu dizi (ya da Copy özelliği uygulayan bir tip) kadar 32'yi uzunluğuna Rust klonlanabilir, bu derler:32'den büyük uzunlukta bir dizi nasıl kopyalanır?

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

Ancak bu doesn 't:

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

Aslında, trait Clone sadece ki, 0, uzunluğu genel bir dizi klon için verimli ve deyimsel yolu ne 32.

, her genel dizi uzunluğu için bir yöntemi bildirir 33 mi?

+0

Bu durumda bir "Vec" kullanamayacağınızın bir nedeni var mı? – Shepmaster

+2

"WTF" ye giden herkes için, [burada uygulama] (https://github.com/rust-lang/rust/blob/1.0.0/src/libcore/array.rs#L41) – remram

cevap

7

impl Clone'u kendi kodunuza ekleyemezsiniz. Bu sorun bu arada çoğunlukla çaba değişen miktarda etrafında çalışabilirsiniz, bir noktada sabit olacak:

  • (sadece somut türde bir yerel değişken var ve tip Copy ise olduğu gibi örneğiniz), klonlama yerine let _cloned = source; kopyalayabilirsiniz.
  • Dizi (derive çalışmayacak) için Clone uygulamak istediğiniz bir yapının alanıysa, Clone öğelerini elle uygulayarak uygulamadaki yukarıdaki numarayı kullanabilirsiniz.
  • Copy türünden olmayan bir dizinin kopyalanması daha zor olduğundan, Clone başarısız olabilir. [x[0].clone(), x[1].clone(), ...]'u istediğiniz kadar yazabilirsiniz, bu çok iş ama en azından doğru olması kesin.
  • Diğer her şey başarısız olursa, yine de yeni bir tür sarıcı oluşturabilirsiniz. Bu ihtiyaç duyduğunuz tüm diğer özellikleri yerine getirmek için epeyce bir boilerplate gerektirir, ancak Clone'u (yine elle) uygulayabilirsiniz.
İlgili konular