Rust 将闭包附加到向量

Kry*_*rix 1 closures types rust

正如这篇文章所说,你可以像这样创建一个闭包向量:

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)),
];
Run Code Online (Sandbox Code Playgroud)

但是为什么不能使用以下方法附加到它:

xs.append(Box::new(move |(x, y)| (2 - y, 2 - x)));
Run Code Online (Sandbox Code Playgroud)

这引发了错误:

    |
162 |         xs.append(Box::new(move |(x, y)| (2 - y, 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)) -> (i32, i32)>>`                                      
                          found struct `std::boxed::Box<[closure@src/lib.rs:162:22: 162:50]>`
Run Code Online (Sandbox Code Playgroud)

jos*_*nda 5

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]>`
Run Code Online (Sandbox Code Playgroud)