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) 的 `slice::into_vec` 函数。
// NB 有关更多信息,请参见 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
///
/// 如果格式化 trait 实现返回了错误,则会出现 `format!` panics。
/// 这表明实现不正确,因为 `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
};
}