gpt4 book ai didi

rust - 为什么 Rust 的 assert_eq!使用匹配实现?

转载 作者:行者123 更新时间:2023-11-29 07:40:24 24 4
gpt4 key购买 nike

这是 Rust 的 assert_eq! macro implementation .为了简洁起见,我只复制了第一个分支:

macro_rules! assert_eq {
($left:expr, $right:expr) => ({
match (&$left, &$right) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
panic!(r#"assertion failed: `(left == right)`
left: `{:?}`,
right: `{:?}`"#, left_val, right_val)
}
}
}
});
}

这里match的目的是什么?为什么不检查不相等性还不够?

最佳答案

好吧,让我们删除匹配项。

    macro_rules! assert_eq_2 {
($left:expr, $right:expr) => ({
if !($left == $right) {
panic!(r#"assertion failed: `(left == right)`
left: `{:?}`,
right: `{:?}`"#, $left, $right)
}
});
}

现在,让我们选择一个完全随机的例子......

fn really_complex_fn() -> i32 {
// Hit the disk, send some network requests,
// and mine some bitcoin, then...
return 1;
}

assert_eq_2!(really_complex_fn(), 1);

这将扩展为...

{
if !(really_complex_fn() == 1) {
panic!(r#"assertion failed: `(left == right)`
left: `{:?}`,
right: `{:?}`"#, really_complex_fn(), 1)
}
}

如您所见,我们调用了函数两次。这不太理想,如果每次调用函数的结果都可能发生变化,则更是如此。

match 只是一种快速、简单的方法,可以对宏的两个“参数”求值一次,并将它们绑定(bind)到变量名。

关于rust - 为什么 Rust 的 assert_eq!使用匹配实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48732263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com