我有MyObjManager
,其中包含MyObj
的数组(超过1500个元素)。 MyObj
有很多String
字段和一个选项整数。
[serialize
函数需要一个管理器和一个价格,用于使用新价格序列化阵列。
类似这样的东西:
use serde::{Serialize};
use serde_json;
#[derive(Serialize, Clone)]
pub struct MyObj {
id: String,
name: String,
price: Option<u32>
}
pub struct MyObjManager {
my_objs: Vec<MyObj>
}
fn get (manager: &MyObjManager, price: u32) -> Vec<MyObj> {
manager.my_objs.iter()
.map(|my_obj| {
MyObj {
price: Some(price),
..my_obj.clone() // string allocation
}
})
.collect()
}
pub fn serialize (manager: &MyObjManager, price: u32) -> String {
let my_objs = get(manager, price);
serde_json::to_string(&my_objs).unwrap()
}
[通过此实现,每个serialize
调用都会分配很多字符串。可以避免这种情况吗?
NB:MyObj
的数组可以被认为是静态的,并且不会随时间变化
在条目上提供迭代器,而不是克隆它们。
fn get(manager: &MyObjManager, price: u32) -> impl std::iter::Iterator<Item=&u32> {
manager.my_objs.iter().filter(|p| price == p)
}
然后将它们一个接一个地序列化,或者收集到Vec
中并一次序列化。