Rust将闭包附加到向量

问题描述

正如this post所说,您可以创建一个这样的闭包向量:

let mut xs: Vec<Box<dyn Fn((i32,i32)) -> (i32,i32)>> = vec![
    Box::new(move |(x,y)| (y,x)),Box::new(move |(x,y)| (1 - y,1 - x)),];

但是为什么不能使用以下内容将其附加:

xs.append(Box::new(move |(x,y)| (2 - y,2 - x)));

这会引发错误

    |
162 |         xs.append(Box::new(move |(x,2 - x)));
    |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected mutable reference,found struct `std::Boxed::Box`                                                            
    |
    = note: expected mutable reference `&mut std::vec::Vec<std::Boxed::Box<dyn std::ops::Fn((i32,i32)>>`                                      
                          found struct `std::Boxed::Box<[closure@src/lib.rs:162:22: 162:50]>`

解决方法

rust中方法的名称与其他语言不同。您似乎有一个正确的主意,但是Vec::append函数将另一个向量的元素添加到目标瞬间。

您应该使用的方法是Vec::push,它将元素推到向量的后面。

从错误中您可以看到,它期望您提供&mut std::vec::Vec<std::boxed::Box<...>>但收到了std::boxed::Box<...>

note: expected mutable reference `&mut std::vec::Vec<std::boxed::Box<dyn std::ops::Fn((i32,i32)) -> (i32,i32)>>`                                      
                          found struct `std::boxed::Box<[closure@src/lib.rs:162:22: 162:50]>`