Macros
#![allow(unused_macros)]
/*----------------------------------------
macro show_compare1 will move its args
if they are not copy
----------------------------------------*/
macro_rules! show_compare1 {
($left:expr , $right:expr) => {
match ($left, $right) {
(left_val, right_val) => {
if(left_val == right_val) {
print!(
"\n {:?} == {:?}",
left_val, right_val
);
}
else {
print!(
"\n {:?} != {:?}",
left_val, right_val
);
}
}
}
};
}
/*----------------------------------------
macro show_compare2 will not move its
args even if they are not copy
----------------------------------------*/
macro_rules! show_compare2 {
($left:expr , $right:expr) => {
match (&$left, &$right) {
(left_val, right_val) => {
if(*left_val == *right_val) {
print!(
"\n {:?} == {:?}",
left_val, right_val
);
}
else {
print!(
"\n {:?} != {:?}",
left_val, right_val
);
}
}
}
};
}
Using Code
fn main() {
// let (a, b) = (1, 2);
let a = String::from("a string");
let mut b = a.clone();
b.push_str(" and another");
// let a = vec![1, 2, 3];
// let mut b = a.clone();
// b.push(4);
show_compare2!(a,b);
/*---------------------------------------
Statements below fail to compile if
a or b are moved.
---------------------------------------*/
print!("\n {:?}", a);
print!("\n {:?}", b);
}
Output
"a string" != "a string and another"
"a string"
"a string and another"