From 5f100699ae62544abe196debdc2ed89ffcd539b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=A6=E5=A2=83=E8=BF=B7=E7=A6=BB?= Date: Mon, 27 Jan 2020 11:47:46 +0800 Subject: [PATCH] =?UTF-8?q?add=20Marco=20=EF=BC=8C=E6=97=B6=E9=97=B4?= =?UTF-8?q?=EF=BC=9A2020-01-27=2011:47:45?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rust-exercise/src/macro_syntax.rs | 38 +++++++++++++++++++++++++++++++ rust-exercise/src/main.rs | 4 ++++ 2 files changed, 42 insertions(+) create mode 100644 rust-exercise/src/macro_syntax.rs diff --git a/rust-exercise/src/macro_syntax.rs b/rust-exercise/src/macro_syntax.rs new file mode 100644 index 00000000..128379c9 --- /dev/null +++ b/rust-exercise/src/macro_syntax.rs @@ -0,0 +1,38 @@ +/// 标准库的定义 +///#[cfg(not(test))] +///#[macro_export] +///#[stable(feature = "rust1", since = "1.0.0")] +///#[allow_internal_unstable(box_syntax)] +///macro_rules! vec { +/// ($elem:expr; $n:expr) => ( +/// $crate::vec::from_elem($elem, $n) +/// ); +/// ($($x:expr),*) => ( +/// <[_]>::into_vec(box [$($x),*]) +/// ); +/// ($($x:expr,)*) => ($crate::vec![$($x),*]) +///} +/// +/// +#[macro_export]//#[macro_export]注解(注释)表示,只要将定义了该宏的板条箱放入范围内,就应使该宏可用。没有此注释,宏将无法进入范围。 +macro_rules! Vec {//然后,我们从macro_rules! 开始宏定义!以及我们定义的不带感叹号的宏的名称。该名称(在本例中为Vec)后跟大括号,表示宏定义的正文。 + ( $( $x:expr ),* ) => {//模式与代码块,宏模式是针对Rust代码结构而非值进行匹配的 + //首先一组括号()包括整个模式,这些括号捕获与括号内的模式匹配的值,以供替换代码使用 + //$()中是$x:expr,它与任何Rust表达式匹配,并为表达式指定名称$x + //*指定该模式与*之前的零个或多个匹配 + { + let mut temp_vec = Vec::new(); + //$()* 表示匹配0次或多次(等价为每个匹配到的表达式执行下面操作),$x表示匹配上的表达式(用户传进来的) + $( + temp_vec.push($x); + )* + temp_vec//最终返回集合 + } + }; +} + +pub fn marco_function() { + ///定义自己的宏。(标准库的是vec!) + let v: Vec = Vec![1, 2, 3];// $x 匹配 1,2,3 三次 + println!("{}", v.len())//宏定义必须在前面 +} \ No newline at end of file diff --git a/rust-exercise/src/main.rs b/rust-exercise/src/main.rs index 4c7f6662..24d8344a 100644 --- a/rust-exercise/src/main.rs +++ b/rust-exercise/src/main.rs @@ -19,6 +19,7 @@ use enum_data_type::*; use example_guessing_game::example_guessing_game; use generic_traits_lifetimes::*; use iterator_demonstration::*; +use macro_syntax::*; use match_syntax::*; use method_syntax::*; use other_function::*; @@ -47,6 +48,7 @@ pub mod control_function; pub mod other_function; pub mod closures_syntax; pub mod smart_point; +pub mod macro_syntax; /// 引用和借用:https://dreamylost.cn/rust/Rust-Rust%E5%AD%A6%E4%B9%A0%E4%B9%8B%E5%BC%95%E7%94%A8%E4%B8%8E%E5%80%9F%E7%94%A8.html /// 所有权:https://dreamylost.cn/rust/Rust-%E6%89%80%E6%9C%89%E6%9D%83.html @@ -127,5 +129,7 @@ fn main() { println!("===================="); mutex_multi_thread(); println!("===================="); + marco_function(); + println!("===================="); //example_guessing_game(); } -- GitLab