2016-04-02 33 views

cevap

2

Sorun, kapatmanın uygulanmadığı Clone. Bu, Rust'ta bilinen bir sorundur: #23501.

Kapatma yerine normal bir işlev kullanırsak? Kapanışınız bir şey yakalamıyor, her şeyden önce. fonksiyonlar Clone uygulamak olmadığı

fn main() { 
    fn is_negative(x: &&i32) -> bool { 
     x.is_negative() 
    } 

    let a = [-1i32, 0, 1]; 

    let mut iter = a.into_iter().skip_while(is_negative).clone(); 

    assert_eq!(iter.next(), Some(&0)); 
    assert_eq!(iter.next(), Some(&1)); 
    assert_eq!(iter.next(), None); 
} 

Ne yazık ki bu, işe yaramaz ya (onlar Copy uygulamak rağmen!). Bu ayrıca bilinen bir sorundur: #24000, #28229.

+0

Aslında, onlar farklı problemlerdir. Bir 'fn' işaretçisi oldukça önemsiz bir şekilde klonlanmış olabilir, bu yalnızca uygulamaya sahip değil. Bir kapanış daha zordur, çünkü klonlanmış olsun ya da olmasın, yakaladığı değerlerin klonlanabileceğine ve * nasıl yakalandıklarına bağlıdır. Artı, bu, "bir kapanışın hangi özellikleri etkilemesi gerektiğini nasıl belirliyorsunuz" diye başlıyor ve her şey çok hızlı dağılıyor. –

+0

Sağ. Sadece arama yaptım ve kapanışlar için ayrı bir sorun buldum, dolayısıyla cevabımı buna göre düzenledim. –

+0

Açıklama için teşekkür ederiz! –