【问题标题】:What is "<[_]>" in Rust?Rust 中的“<[_]>”是什么?
【发布时间】:2021-12-24 15:35:14
【问题描述】:

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

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

里面的&lt;[_]&gt;到底是什么?

【问题讨论】:

  • 哇,Rust 通常可读性和直观性都很好,但 &lt;[_]&gt;:: 看起来像是直接来自 esolang 的东西。

标签: rust


【解决方案1】:

分解语法的具体部分:

【讨论】:

【解决方案2】:

让我们一步一步来看看&lt;[_]&gt;::into_vec(box [$($x),+])是如何产生Vec的:

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

可以以许多更简单的方式完成,但此代码经过微调以提高vec! 的性能。例如,由于可以提前知道Vec 的大小,所以into_vec 不会导致Vec 在其构造过程中被重新分配。

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 2021-03-19
    • 2022-01-23
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    相关资源
    最近更新 更多