< 返回版块

Matheritasiv 发表于 2023-03-04 15:18

Tags:闭包

如下所示:

 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进了闭包,请问这个需求该怎么写?

评论区

写评论
苦瓜小仔 2023-03-04 18:59

图层叠加肯定有成熟的做法,我感觉这里的数据结构不对,而不是单纯的闭包捕获问题。

作者 Matheritasiv 2023-03-04 18:26

多谢指点。其实renderer里面调用的那个renderer的最后一个参数不是layer而是&self,不过这样又会有借用的问题。我再研究研究,或许应该改用其他不用闭包的结构。

--
👇
苦瓜小仔:

方法 1

方法 2

能编译不代表这样做最好。

你最好看看成熟的相关库是怎么做的。

苦瓜小仔 2023-03-04 17:58

方法 1

方法 2

能编译不代表这样做最好。

你最好看看成熟的相关库是怎么做的。

作者 Matheritasiv 2023-03-04 17:03

动机是我想创建一个描述图层的结构Layernew_item用来创建子图层,子图层及其在父图层中的位置信息收集在向量items中,闭包renderer用于将图层的一个矩形区域向父图层提交并混成,一直递归进行到根图层。

--
👇
苦瓜小仔: 没有帮助的评论:

impl<'a> Layer<'a> {
    fn new_item(&'a mut self

典型的生命周期标注错误。这样的签名即便能编译,也无法使用。

renderer: Box<dyn FnMut((usize, usize), PixmapRGBA) + 'a>

看起来像捕获自身数据的闭包。

生命周期错误、试图 自引用,加上内部可变。Rust 的死穴都给你碰上了。

还有,问问题的同时也想着节省试图回答问题的人的时间:描述动机,提供 能(部分)工作的最小(完整)示例

苦瓜小仔 2023-03-04 16:10

没有帮助的评论:

impl<'a> Layer<'a> {
    fn new_item(&'a mut self

典型的生命周期标注错误。这样的签名即便能编译,也无法使用。

renderer: Box<dyn FnMut((usize, usize), PixmapRGBA) + 'a>

看起来像捕获自身数据的闭包。

生命周期错误、试图 自引用,加上内部可变。Rust 的死穴都给你碰上了。

还有,问问题的同时也想着节省试图回答问题的人的时间:描述动机,提供 能(部分)工作的最小(完整)示例

1 共 5 条评论, 1 页