Ben olmayan bazı copyable türünü ve tüketir ve (belki) onu üreten bir işlevi vardır:Değeri taşıdığım bir kutuyu nasıl yeniden kullanabilirim?
struct NotBox<T> {
contents: T
}
Biz yapabilirsiniz:
type Foo = Vec<u8>;
fn quux(_: Foo) -> Option<Foo> {
Some(Vec::new())
}
Şimdi kavramsal bir şekilde Box
çok benzer bir türünü göz önünde geçici NotBox
içeriğini dışarı hareket eder ve onu dönmeden önce geri bir şey koyar bir fonksiyon yazabiliriz:
fn bar(mut notbox: NotBox<Foo>) -> Option<NotBox<Foo>> {
let foo = notbox.contents; // now `notbox` is "empty"
match quux(foo) {
Some(new_foo) => {
notbox.contents = new_foo; // we put something back in
Some(notbox)
}
None => None
}
}
Ben Box
es ile çalışır benzer bir işlevi yazmak istiyorum ama derleyici bunu sevmez:
fn baz(mut abox: Box<Foo>) -> Option<Box<Foo>> {
let foo = *abox; // now `abox` is "empty"
match quux(foo) {
Some(new_foo) => {
*abox = new_foo; // error: use of moved value: `abox`
Some(abox)
}
None => None
}
}
yerine Some(Box::new(new_foo))
geri dönebilirler ama bu gereksiz tahsisini gerçekleştiren - Zaten benim emrinde bazı bellek var! Bunu önlemek mümkün mü?
Ben de match
tabloların kurtulmak istiyorum ama yine derleyici (hatta NotBox
versiyonu için) memnun değil:
fn bar(mut notbox: NotBox<Foo>) -> Option<NotBox<Foo>> {
let foo = notbox.contents;
quux(foo).map(|new_foo| {
notbox.contents = new_foo; // error: capture of partially moved value: `notbox`
notbox
})
}
o geçici bir çözüm mümkün mü?
O'dan daha fazlasını soruyor gibisiniz Burada ne soru var. Maç vs harita biri yeni bir soruya taşınmalı gibi görünüyor. –
İlk kısma cevap verecektim ama fark ettim ki henüz 'Box 'çalışmalarından nasıl geçtiğini anlayamıyorum; Deref veya DerefMut özelliklerine bağlı görünmüyor. Bu yüzden de iyi bir cevap bekliyorum! –
@ChrisEmerson Maç bölümü, benim problemimin en küçük örneğini oluşturmaya çalıştığımda ortaya çıkan bir şeydi, bu yüzden üzerine fazla araştırma yapmadım. Bunun muhtemelen genel soruyla ve "kısmi" işlerin nasıl yürüdüğünü anlamadığım gerçeği ile ilgili olduğunu düşündüm. – mrhania