gpt4 book ai didi

rust - 当T包装借入的数据时,如何实现Borrow

转载 作者:行者123 更新时间:2023-12-03 11:38:13 25 4
gpt4 key购买 nike

给定How to borrow a field for serialization but create it during deserialization?的以下定义:

#[derive(Serialize)]
struct SerializeThing<'a> {
small_header: (u64, u64, u64),
big_body: &'a str,
}

#[derive(Deserialize)]
struct DeserializeThing {
small_header: (u64, u64, u64),
big_body: String,
}
如何实现 Borrow特性,以便将拥有的数据自然地存储在(例如)HashMap中,并由它们或由其借用的对应对象查询?可能出现的最接近的事物如下:
impl DeserializeThing {
fn as_serialize(&self) -> SerializeThing<'_> {
let DeserializeThing { small_header, big_body } = self;
let small_header = *small_header;
let big_body = big_body.as_str();
SerializeThing { small_header, big_body }
}
}
这还不够。

最佳答案

你不能Borrow::borrow必须返回引用,并且您无法从对SerializeThing的引用中获取对DeserializeThing的引用,因为这些类型根本不兼容ABI。

如果性能很重要,并且您无力支付DeserializeThing实例的构造/字符串分配的费用,则可以使用hashbrown::HashMap代替std::collections::HashMaphashbrown是标准库用于其自己的HashMap实现的库,但是它具有一些更有用的方法。
现在对您有用的一种是raw entry API(and mutable raw entry)。
特别是,它允许您从其哈希值和匹配函数中获取 map 条目:

pub fn from_hash<F>(self, hash: u64, is_match: F) -> Option<(&'a K, &'a > V)> where
F: FnMut(&K) -> bool

Access an entry by hash.


由于您可以为 HashDeserializeThing都实现 SerializeThing,以为相同的值获得相同的哈希,因此在您的情况下,此API易于使用。

关于rust - 当T包装借入的数据时,如何实现Borrow <T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65810592/

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