Rust 中的“<[_]>”是什么?

at5*_*321 36 syntax rust

vec!宏实现中有这样的规则:

($($x:expr),+ $(,)?) => (
    $crate::__rust_force_expr!(<[_]>::into_vec(box [$($x),+]))
);
Run Code Online (Sandbox Code Playgroud)

<[_]>里面到底是什么?

kmd*_*eko 30

分解语法的特定部分:


loo*_*ops 15

让我们一步步看看如何<[_]>::into_vec(box [$($x),+])生成 a Vec

  1. [$($x),+]扩展为输入元素数组:[1, 2, 3]
  2. box ...将其放入Box. box表达式是仅限夜间使用的语法糖 for Box::newbox 5是语法糖 for Box::new(5)(实际上是相反的:内部Box::new使用box,它是在编译器中实现的)
  3. <[_]>::into_vec(...)to_vec对包含具有推断类型 ( ) 的元素的切片调用该方法[_]。出于[_]语法原因,需要将 括在尖括号中以调用切片类型上的方法。Andinto_vec是一个函数,它接受一个装箱切片并生成一个Vec
    pub fn into_vec<A: Allocator>(self: Box<Self, A>) -> Vec<T, A> {
        // ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

可以通过许多更简单的方法来完成,但此代码经过微调以提高vec!. Vec例如,由于可以提前知道的大小,into_vec因此不会导致Vec在构造期间重新分配 。