1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/// 创建一个包含参数的 [`Vec`]。
///
/// `vec!` 允许使用与数组表达式相同的语法来定义 `Vec`。
/// 该宏有两种形式:
///
/// - 创建一个包含给定元素列表的 [`Vec`]:
///
/// ```
/// let v = vec![1, 2, 3];
/// assert_eq!(v[0], 1);
/// assert_eq!(v[1], 2);
/// assert_eq!(v[2], 3);
/// ```
///
/// - 根据给定的元素和大小创建 [`Vec`]:
///
/// ```
/// let v = vec![1; 3];
/// assert_eq!(v, [1, 1, 1]);
/// ```
///
/// 请注意,与数组表达式不同,此语法支持所有实现 [`Clone`] 的元素,并且元素的数量不必是常量。
///
/// 这将使用 `clone` 复制表达式,因此在具有非标准 `Clone` 实现的类型上使用此表达式时应格外小心。
/// 例如,`vec![Rc::new(1); 5]` 将对相同的 boxed 整数值创建五个引用的 vector,而不是对 boxed 整数独立引用的五个引用。
///
///
/// 另外,请注意,允许使用 `vec![expr; 0]`,并产生一个空的 vector。
/// 然而,这仍然会计算 `expr`,并立即丢弃结果值,因此请注意副作用。
///
/// [`Vec`]: crate::vec::Vec
///
///
///
///
///
#[cfg(not(test))]
#[macro_export]
#[stable(feature = "rust1", since = "1.0.0")]
#[allow_internal_unstable(box_syntax, liballoc_internals)]
macro_rules! vec {
    () => (
        $crate::__rust_force_expr!($crate::vec::Vec::new())
    );
    ($elem:expr; $n:expr) => (
        $crate::__rust_force_expr!($crate::vec::from_elem($elem, $n))
    );
    ($($x:expr),+ $(,)?) => (
        $crate::__rust_force_expr!(<[_]>::into_vec(box [$($x),+]))
    );
}

// HACK(japaric): 对于 cfg(test),此宏定义所需的固有 `[T]::into_vec` 方法不可用。
// 而是使用仅与 cfg(test) NB 一起提供的 `slice::into_vec` 函数,有关更多信息,请参见 slice.rs 中的 slice::hack 模块。
//
//
#[cfg(test)]
macro_rules! vec {
    () => (
        $crate::vec::Vec::new()
    );
    ($elem:expr; $n:expr) => (
        $crate::vec::from_elem($elem, $n)
    );
    ($($x:expr),*) => (
        $crate::slice::into_vec(box [$($x),*])
    );
    ($($x:expr,)*) => (vec![$($x),*])
}

/// 使用运行时表达式的插值创建 `String`。
///
/// `format!` 收到的第一个参数是格式字符串。这必须是字符串字面量。格式字符串的作用是包含在 {{} 中。
///
/// 除非使用命名或位置参数,否则传递给 `format!` 的其他参数将以给定的顺序替换格式字符串中的 {}。有关更多信息,请参见 [`std::fmt`]。
///
///
/// `format!` 的常见用法是字符串的连接和内插。
/// [`print!`] 和 [`write!`] 宏使用相同的约定,具体取决于字符串的预期目标。
///
/// 要将单个值转换为字符串,请使用 [`to_string`] 方法。这将使用 [`Display`] 格式 trait。
///
/// [`std::fmt`]: ../std/fmt/index.html
/// [`print!`]: ../std/macro.print.html
/// [`write!`]: core::write
/// [`to_string`]: crate::string::ToString
/// [`Display`]: core::fmt::Display
///
/// # Panics
///
/// `format!` panics (如果格式化 trait 实现返回错误)。
/// 这表明实现不正确,因为 `fmt::Write for String` 本身从不返回错误。
///
/// # Examples
///
/// ```
/// format!("test");
/// format!("hello {}", "world!");
/// format!("x = {}, y = {y}", 10, y = 30);
/// ```
///
///
///
///
///
#[macro_export]
#[stable(feature = "rust1", since = "1.0.0")]
#[cfg_attr(not(test), rustc_diagnostic_item = "format_macro")]
macro_rules! format {
    ($($arg:tt)*) => {{
        let res = $crate::fmt::format($crate::__export::format_args!($($arg)*));
        res
    }}
}

/// 强制 AST 节点使用表达式以改善模式位置的诊断。
#[doc(hidden)]
#[macro_export]
#[unstable(feature = "liballoc_internals", issue = "none", reason = "implementation detail")]
macro_rules! __rust_force_expr {
    ($e:expr) => {
        $e
    };
}