避免在锈中克隆字符串字段

问题描述 投票:1回答:1

我有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的数组可以被认为是静态的,并且不会随时间变化

rust clone allocation serde
1个回答
0
投票

在条目上提供迭代器,而不是克隆它们。

fn get(manager: &MyObjManager, price: u32) -> impl std::iter::Iterator<Item=&u32> {
    manager.my_objs.iter().filter(|p| price == p)
}

然后将它们一个接一个地序列化,或者收集到Vec中并一次序列化。

© www.soinside.com 2019 - 2024. All rights reserved.