2016-01-12 21 views
5

kullanmak zincirini iter` değişiklik yapmaya. Ancak, benim kendi yetiştirme için, ben bu (bir Iter için LockResult dönüştürmeden) standart Result/Option yöntemleri kullanmak gibi bir şey değiştirmeye çalışıyorlar:`Ben benzeyen bir fonksiyona sahip vb` and_then`,

store.read().ok() 
    .and_then(|g| (*g).get(key)) 
    .and_then(|v| v.read().ok()) 
    .map(|v| (*v).clone()); 

Ama bu g does not live long enough bu beni anlatıyor. Çeşitli yerlerde ref ve as_ref eklemeyi denedim, ancak derlemek için alamıyorum. Neyi kaçırıyorum?

Ben o gibi işe alabilirsiniz biliyorum:

store.read().ok() 
     .and_then(|g| { 
      (*g).get(key) 
       .and_then(|v| v.read().ok()) 
       .map(|v| (*v).clone()) 
     }) 

Ama iter durumda gibi zincire bunu yapabilmek istiyorum.

+0

(Potansiyel olarak soru yok) Bu, iter() ve 'into_iter()' arasındaki fark değil mi? Sahipliğinizi zincirin geri kalanına taşımak için 'into_iter()' işlevini kullanmak isteyebilirsiniz, böylece referanslarınız boyunca yaşarsınız? –

+0

@SimonWhitehead, yorum için teşekkürler! Evet, bence bu tam olarak 'iter' ile 'into_iter' arasındaki farktır - ama tersine. I ** yapmak 'iter' yerine 'in_iter 'kullanmak istiyorum, ve aslında' iter 'gibi bir şey yapan bir' ve_then' varyasyonu istiyorum, ama 'as_ref' doğru açılanını anlayamıyorum vb. bunu yapar. 'In_iter' kullanmak için yukarıdaki ilk örneği değiştirdiğimde, ikinci örneğimle aynı hata mesajlarını alıyorum. –

+0

Oyun parkında bir MVCE'yi benim için başkaları ile uğraştığını sanmıyorum. –

cevap

3

Tamam, derleyici bu akşam benimle dalga geçiyor.

fn get(store: &Store, key: &str) -> Option<Attributes> { 
    let r = store.read(); 
    let x = r.as_ref().ok() 
     .and_then(|g| (*g).get(key)) 
     .and_then(|v| v.read().ok()) 
     .map(|v| (*v).clone()); 
    x 
} 

satır içi ya r veya x, tekrar başka does not live long enough hatası döneriz:

ben derlemek için bu sihir var. Neden olduğundan emin değilim, çünkü prensip olarak, kilit bekçisi, ifadenin sonuna kadar geçici olarak aktif kalmalıdır.

İlgili konular