2015-01-10 67 views
1

我想創建一個結構來保存切片,並且可以返回對該切片中項目的引用。到目前爲止,我已經能夠做到這一點:不能使用可變片不可變的切片很好

pub struct Stride<'a> { 
    items: &'a [f32], 
} 

impl<'a> Iterator for Stride<'a> { 
    type Item = &'a f32; 
    fn next(&mut self) -> Option<&'a f32> { 
     Some(&self.items[0]) 
    } 
} 

然而,當我改變片是一個可變片:

pub struct Stride<'a> { 
    items: &'a mut [f32], 
} 

impl<'a> Iterator for Stride<'a> { 
    type Item = &'a f32; 
    fn next(&mut self) -> Option<&'a f32> { 
     Some(&self.items[0]) 
    } 
} 

我得到一個編譯錯誤:

test.rs:8:14: 8:28 error: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements 
test.rs:8   Some(&self.items[0]) 
         ^~~~~~~~~~~~~~ 

爲什麼我不能容納這個可變片,並返回對該片中元素的引用?我想更進一步:返回此切片中元素的可變引用。這甚至有可能嗎?

+0

我假設你問這是怎麼實現的。如果你想在真實世界中做到這一點,你可以使用標準中的['iter_mut'](http://doc.rust-lang.org/std/slice/trait.SliceExt.html#tymethod.iter_mut)圖書館。 – Shepmaster

回答

2

真的,你想要做的是創建一個可變引用的迭代器。那一直是answered before,至少有一個example of how to do it

總之,Rust不能告訴你不會多次返回相同的可變引用。如果你這樣做,那麼你會有別名,這打破了Rust的規則。順便說一句,你所示的迭代器不安全,因爲它總是會返回第一項!作爲比Rust更聰明的人,您必須手動驗證您是否違反安全規則,然後使用unsafe代碼來忽略警告。經常使用類似mem::transmute的東西。