rust 从函数中返回字符串的一部分,而不进行额外的分配

w8f9ii69  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(117)

我想要一个函数,它返回一个内部生成的更大字符串的 part,而不会导致返回部分的单独分配:

fn generate_full_string() -> String {"example: 123".to_owned()}
fn generate_partial_string() -> String {
    generate_full_string()[9..].to_owned()
}

这里,generate_partial_string具有所需的行为:它使用某种算法生成String(这里用generate_full_string建模),然后返回它的一部分,具体来说,从第9个字符开始的部分。根据我的理解,这里的问题是,当在从generate_string()[9..]返回的str上调用to_owned()时,会创建一个新的堆分配来存储返回的部分字符串数据,并且将来自generate_string()[9..]的部分串数据复制到其中。
相反,我希望重用在generate_full_string中创建的分配,并使用它来存储返回的部分字符串。换句话说,我希望从generate_partial_string返回的String值指向generate_full_string创建的堆分配的所需部分,以保存完整的字符串。
是否可以在安全的Rust中做到这一点?是否可以使用其他API模式从函数返回较大字符串的一部分,而不需要该函数从其调用者的作用域中获取String的所有权?

6yt4nkrj

6yt4nkrj1#

您可以使用.replace_range()和一个空字符串来删除前缀:

fn generate_partial_string() -> String {
    let mut full = generate_full_string();
    full.replace_range(..9, "");
    full
}

相关问题