#[derive(Debug, Clone)]
pub struct Schema {
name: String,
sections: Vec<String>,
}
pub struct SchemaRegistry(HashMap<String, Schema>);
impl SchemaRegistry {
pub fn new() -> Self {
SchemaRegistry(HashMap::new())
}
pub fn register<'a>(&mut self, schema: Schema) -> &mut Self {
self.0.insert(schema.name.clone(), schema);
self
}
}
1
共 8 条评论, 1 页
评论区
写评论因为Schema具有name: String的所有权,而插入map会导致schema发生移动,所以& schema.name直接引用是不行的。这时候就要考虑作为K的类型的特点了,String虽然可以被移动,但是其内部有固定不变的数据位置。所以,可以用点魔法,做点unsafe的东西,安全性需要设计者自行考虑:
为了展示两种实现,做了个
Sharing
特征来方便复用,SharingString
、SharingStr
是给前面说的方案套了个壳(wrapper)。 具体的实现,可以根据你的功能需求,做一些取舍裁剪,比如上面我在register里面做了通用判断(remove),可以按实际业务优化一下那么一丢丢的少执行点无效代码。最后,如果K不是String类型的,其实也是类似的,就像Rc这种,外部壳的移动不会涉及实质的数据复制,从而达到减少clone的目的
代码调整一下,也许可行。
faststr了解一下
直接Arc糊上
我觉得这帖子里的 internment的方案还不错啊
--
👇
TinusgragLin: 太巧了,上个星期 Rust 用户论坛站给我发的一周汇总中就有类似的问题,楼主可以参考一下。
我倒觉得不是最好的方案,(原帖里也有讨论到,)如果有碰撞就麻烦了。
省流,算hash
--
👇
TinusgragLin: 太巧了,上个星期 Rust 用户论坛站给我发的一周汇总中就有类似的问题,楼主可以参考一下。
太巧了,上个星期 Rust 用户论坛站给我发的一周汇总中就有类似的问题,楼主可以参考一下。