如下所示:
1 struct Layer<'a> {
2 index: usize,
3 data: PixmapRGBA,
4 items: Vec<((usize, usize), Rc<RefCell<Layer<'a>>>)>,
5 renderer: Box<dyn FnMut((usize, usize), PixmapRGBA) + 'a>,
6 }
7
8 impl<'a> Layer<'a> {
9 fn new_item(&'a mut self, pos: (usize, usize), size: (usize, usize)) -> Rc<RefCell<Layer>> {
10 let index = self.items.len();
11 let data = PixmapRGBA::new(size);
12 let item = Rc::new(RefCell::new(Layer { index, data,
13 items: Vec::default(),
14 renderer: Box::new(|(x, y), mut pixmap| {
15 //pixmap.region_composite_rev((x, y), &data);
16 //let (bx, by) = self.items[index].0;
17 //(*self.renderer)((bx + x, by + y), pixmap);
18 }),
19 }));
20 //item.borrow_mut().renderer = {
21 // let item = item.clone();
22 // Box::new(move |(x, y), mut pixmap| {
23 // pixmap.region_composite_rev((x, y), &item.borrow().data);
24 // let (bx, by) = self.items[item.borrow().index].0;
25 // (*self.renderer)((bx + x, by + y), pixmap);
26 // })
27 //};
28 self.items.push((pos, item.clone()));
29 item
30 }
31 }
我希望第15行的data
和第17行的index
捕获第12行的变量,直接这样写捕获的是第10、11行,于是我去掉第15~17行,加上第20~27行,但这样self
又被move进了闭包,请问这个需求该怎么写?
1
共 5 条评论, 1 页
评论区
写评论图层叠加肯定有成熟的做法,我感觉这里的数据结构不对,而不是单纯的闭包捕获问题。
多谢指点。其实
renderer
里面调用的那个renderer
的最后一个参数不是layer
而是&self
,不过这样又会有借用的问题。我再研究研究,或许应该改用其他不用闭包的结构。--
👇
苦瓜小仔:
方法 1
方法 2
能编译不代表这样做最好。
你最好看看成熟的相关库是怎么做的。
方法 1
方法 2
能编译不代表这样做最好。
你最好看看成熟的相关库是怎么做的。
动机是我想创建一个描述图层的结构
Layer
,new_item
用来创建子图层,子图层及其在父图层中的位置信息收集在向量items
中,闭包renderer
用于将图层的一个矩形区域向父图层提交并混成,一直递归进行到根图层。--
👇
苦瓜小仔: 没有帮助的评论:
典型的生命周期标注错误。这样的签名即便能编译,也无法使用。
看起来像捕获自身数据的闭包。
生命周期错误、试图 自引用,加上内部可变。Rust 的死穴都给你碰上了。
还有,问问题的同时也想着节省试图回答问题的人的时间:描述动机,提供 能(部分)工作的最小(完整)示例。
没有帮助的评论:
典型的生命周期标注错误。这样的签名即便能编译,也无法使用。
看起来像捕获自身数据的闭包。
生命周期错误、试图 自引用,加上内部可变。Rust 的死穴都给你碰上了。
还有,问问题的同时也想着节省试图回答问题的人的时间:描述动机,提供 能(部分)工作的最小(完整)示例。