小编Tod*_*ork的帖子

有没有办法从传递的 expr 访问 rust 宏中定义的变量?

假设我想让以下宏起作用:

macro_rules! process_numbers {
    ($name:ident, $process:expr) => {
        let $name: Vec<_> = vec![0, 1, 2].iter().map(|num| {
            println!("{}", path); // dummy preprocessing
            let foo = 3; // some other preprocessing involving side-effects
            $process
        }).collect();
    }
}

process_numbers!(name, {
    num + foo
});
Run Code Online (Sandbox Code Playgroud)

有没有办法让我可以从内部num访问?foo$process

rust rust-macros

5
推荐指数
1
解决办法
771
查看次数

收集到 HashMap 时是否可以检测冲突?

IntoIterator我想在将 a 收集到 a时检测日志中的冲突并发出警告HashMap。当前 Rust 收集到 a 的行为HashMap是用最新的值默默地覆盖早期的值。

fn main() {
    let a = vec![(0, 1), (0, 2)];
    let b: std::collections::HashMap<_, _> = a.into_iter().collect();
    println!("{}", b[&0]);
}
Run Code Online (Sandbox Code Playgroud)

输出:

fn main() {
    let a = vec![(0, 1), (0, 2)];
    let b: std::collections::HashMap<_, _> = a.into_iter().collect();
    println!("{}", b[&0]);
}
Run Code Online (Sandbox Code Playgroud)

(操场)

一种可能的解决方法是收集Vec然后手动编写转换代码,但这会引入额外的分配开销和不可读的代码。不消耗原始集合并比较len()s 的噪音较小,但仍然占用 1 倍以上的内存(?)并且无法检测到碰撞到底发生在哪里。

有没有更优雅的方式来处理HashMap碰撞?

hashmap rust

2
推荐指数
1
解决办法
540
查看次数

标签 统计

rust ×2

hashmap ×1

rust-macros ×1