Rust中为何调用to_string时需在整数前加引用符号?
为什么拼接字符串时要给
number.to_string()加&? 要搞懂这个问题,得先明白Rust里String类型的+运算符到底怎么工作的:
Rust为String实现的Add trait签名是这样的:
impl Add<&str> for String { type Output = String; fn add(self, rhs: &str) -> String; }
简单说就是:只有String和&str类型才能用+拼接,而且+会取走左边String的所有权,把右边的&str内容追加进去,最后返回新的String。
回到你的代码:
text.to_owned()把字符串字面量转成了String," "本身就是&str,所以text.to_owned() + " "完全符合要求,返回的还是String。number.to_string()会生成一个全新的String实例,不是&str。如果直接写+ number.to_string(),相当于尝试把String和String拼接,但Rust根本没提供这种Add实现,自然编译报错。- 加
&之后,&number.to_string()是对这个临时String取引用,得到&String。而Rust会自动把&String强制转成&str(因为String实现了Deref<Target=str>),这下就符合Add<&str>的要求了,所以能正常编译。
额外建议
对新手来说,用format!宏拼接字符串更直观,不用纠结所有权和引用的问题:
fn main() { let number = 42; let text = "The answer is"; let result = format!("{} {}", text, number); println!("{}", result); }
内容的提问来源于stack exchange,提问作者Pytai
相关产品推荐
相关产品推荐

