我可以用一个表达式来完成这个吗?
*map.entry(key).or_default() += 1;
let count = *map.get(&key).unwrap();
理想情况下,我希望这是一个原子操作,但如果需要,我可以锁定。
我可以用一个表达式来完成这个吗?
*map.entry(key).or_default() += 1;
let count = *map.get(&key).unwrap();
理想情况下,我希望这是一个原子操作,但如果需要,我可以锁定。
我有这个工作代码:
/* Ignore IPv6. */
let via = if let IpAddr::V4(via) = addr.ip() {
via
} else {
warn!("(unsupported) ipv6 packet from ${addr}");
continue // abandon this packet and try the next packet
};
// ...process this packet with "via: Ipv4Addr" in scope...
是否有一种惯用的方法可以从枚举中获取所需的变体,而无需via
被提及三次?
或者这就是我应该忽略 Rust 中不需要的变体的方式?
如果我有两个 32 位值 X 和 Y,如何有效地将它们的位按照 xyxyxyxy 的顺序交错为一个 64 位值 Z...(Z 是 Z 顺序曲线上的一个位置。)
我可以迭代 X 和 Y 中的每个位,同时设置 Z 中的位。这看起来效率很低。
是否有一种捷径可以将两个值中的位交错为一个大值,而这需要不到一百条 CPU 指令?
我怎样才能有效地实施:
fn shorten(arg: [u8; 32]) -> [u8; 30] {
???
}
它会丢弃最后两个字节吗?
显然我可以使用 for 循环,并在堆栈上创建一个新的较短数组。
编译器似乎有机会离开堆栈并[u8; 32]
仅使用它[u8; 30]
的。
通常我会使用切片,但这里我需要返回一个较短的数组。
要使用旧向量(我想清空)的内容创建一个新向量,我将使用:
foo.bar = my_vector.drain(0..).collect();
这是惯用的 Rust 吗?
Drain() 是否已优化掉,原始向量的内存是否已分配给新向量?
或者每个元素都被一一复制到新的堆分配中?