Rust中如何从前置元素与数组生成切片?优化冗余代码问询
优化方案
针对你觉得冗余的迭代器解引用问题,这里有几种更简洁高效的实现方式:
方案1:使用into_iter()替代iter()
数组的into_iter()会直接生成元素类型的迭代器(而非引用),这样就不需要额外的map(|x| *x)来解引用:
pub fn new(id_bytes: [u8; 32], ipv4: Ipv4Addr, port: u16) -> Result<RemotePeer, secp256k1::Error> { let serialised_pkey: Vec<u8> = [0x02].into_iter().chain(id_bytes).collect(); Ok(RemotePeer { id: U256::from_le_bytes(id_bytes), pkey: PublicKey::from_slice(&serialised_pkey)?, ipv4, port }) }
解释:[0x02].into_iter()返回IntoIter<u8, 1>,id_bytes作为[u8;32]会自动实现IntoIterator,两者迭代器的元素都是u8类型,可直接链式调用并收集为Vec<u8>。
方案2:栈上数组构造(更高效,无堆分配)
如果不需要动态容器,直接用固定大小的栈上数组填充,避免Vec的堆分配开销:
pub fn new(id_bytes: [u8; 32], ipv4: Ipv4Addr, port: u16) -> Result<RemotePeer, secp256k1::Error> { let mut serialised_pkey = [0u8; 33]; serialised_pkey[0] = 0x02; serialised_pkey[1..].copy_from_slice(&id_bytes); Ok(RemotePeer { id: U256::from_le_bytes(id_bytes), pkey: PublicKey::from_slice(&serialised_pkey)?, ipv4, port }) }
解释:直接构造33字节的数组,首位置0x02,剩余32字节从id_bytes拷贝,最后直接传数组引用给from_slice,性能更优。
方案3:用std::iter::once生成前置字节
借助once生成单个元素的迭代器,配合id_bytes的into_iter(),写法更直观:
use std::iter::once; pub fn new(id_bytes: [u8; 32], ipv4: Ipv4Addr, port: u16) -> Result<RemotePeer, secp256k1::Error> { let serialised_pkey: Vec<u8> = once(0x02).chain(id_bytes.into_iter()).collect(); Ok(RemotePeer { id: U256::from_le_bytes(id_bytes), pkey: PublicKey::from_slice(&serialised_pkey)?, ipv4, port }) }
解释:once(0x02)直接生成包含单个u8的迭代器,和id_bytes.into_iter()的元素类型一致,无需额外转换。
内容的提问来源于stack exchange,提问作者fadedbee
相关产品推荐
相关产品推荐

