Returning iterator of a Vec in a RefCell
给定以下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | use std::slice::Iter; use std::cell::RefCell; struct Foo { bar: RefCell<Vec<u32>>, } impl Foo { pub fn iter(&self) -> Iter<u32> { self.bar.borrow().iter() } } fn main() {} |
我收到有关终身问题的错误消息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | error: borrowed value does not live long enough --> src/main.rs:9:9 | 9 | self.bar.borrow().iter() | ^^^^^^^^^^^^^^^^^ does not live long enough 10 | } | - temporary value only lives until here | note: borrowed value must be valid for the anonymous lifetime #1 defined on the body at 8:36... --> src/main.rs:8:37 | 8 | pub fn iter(&self) -> Iter<u32> { | _____________________________________^ starting here... 9 | | self.bar.borrow().iter() 10 | | } | |_____^ ...ending here |
我如何能够返回并使用
您不能执行此操作,因为它可以绕过运行时检查是否存在唯一性违规。
1 2 3 | &'a RefCell< T > -> Ref<'a, T> (with borrow) or RefMut<'a, T> (with borrow_mut) &'b Ref<'a, T> -> &'b T &'b mut RefMut<'a, T> -> &'b mut T |
此处的关键点是
您可以做的最简单的事情是返回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | use std::cell::Ref; struct VecRefWrapper<'a, T: 'a> { r: Ref<'a, Vec< T >> } impl<'a, 'b: 'a, T: 'a> IntoIterator for &'b VecRefWrapper<'a, T> { type IntoIter = Iter<'a, T>; type Item = &'a T; fn into_iter(self) -> Iter<'a, T> { self.r.iter() } } |
(在操场上尝试)
您不能直接为