【问题标题】:String concatenation in rust and borrowing生锈和借用中的字符串连接
【发布时间】:2021-02-23 07:08:05
【问题描述】:

我最近一直在学习 rust。

我偶然发现了一个真正困扰我的 sn-p。

为什么会这样

    fn main() {
    let s1 = String::from("Hello, ");
    let s2 = String::from("world!");
    let s3 = s1 + &s2;
    println!("{}",s3)
}

这不是吗?

fn main() {
    let s1 = String::from("Hello, ");
    let s2 = String::from("world!");
    let s3 = &s1 + s2;
    println!("{}",s3)
}

提前谢谢你

【问题讨论】:

    标签: rust ownership borrowing


    【解决方案1】:

    从技术角度来看,这是因为String 实现了Add<&str>Deref<Target=str>。因此编译器可以将您的第一个示例s1 + &s2 重写为s1.add (s2.deref())

    但是&String&str 都没有实现Add,因此编译器无法将&s1 + … 重写为(&s1).add (…)

    从语言设计的角度来看,之所以做出这个选择,是因为如果在 s1 的当前内容之后已经分配了足够的空间,s1 + … 可以在不分配的情况下完成,但 &s1 + … 总是需要分配,它是决定明确分配。如果你想在操作后继续使用原来的s1,你需要明确地克隆它:

    let s3 = s1.clone() + &s2;
    

    或者如果性能真的那么关键,您需要预先分配足够的内存来保存结果:

    let s3 = String::with_capacity (s1.len() + s2.len()) + &s1 + &s2;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      相关资源
      最近更新 更多