2015-01-10 3 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

Я предполагаю, что вы просите об этом, чтобы изучить, как он будет реализован. Если вы хотите сделать это в The Real World, вы можете просто использовать ['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.

Резюме состоит в том, что Ржавчина не может сказать, что вы не возвращаете то же самое mutable reference более одного раза. Если вы это сделали, то у вас будет сглаживание, что нарушает правила Руста. Как и в стороне, ваш итератор, как показано , небезопасен, потому что он всегда будет возвращать первый элемент! Как человек умнее Руста, вам нужно вручную убедиться, что вы не нарушаете правила безопасности, а затем используйте код unsafe, чтобы игнорировать предупреждения. Часто используется код mem::transmute.

Смежные вопросы