9String

文章讨论了Rust编程语言中关于`String`类型、引用以及所有权规则的问题。在Rust中,`String`的`push_str`方法允许添加字符串切片,而不获取所有权。另一方面,尝试在使用`+`操作符后再次使用`s1`会导致编译错误,因为`s1`的所有权已转移。文章还提到了`format!`宏作为更灵活的字符串连接选项,它不会获取参数的所有权。
摘要由CSDN通过智能技术生成

fn main() { let data = "hello world"; let s = data.to_string(); println!("{} {}", data, s); let mut s = String::from("foo"); let s1 = String::from(" bar"); s.push_str(&s1); println!("{}", s); let mut s = String::from("foo"); s.push_str(" bar"); println!("{}", s); }

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

fn main() { let s1 = String::from("hello"); let s2 = String::from(" world"); let s3 = s1 + &s2; println!("{} {}", s2, s3); // println!("{}", s1);//这一行会报错 } 因为+类似使用add(self,s:&str)->String{...}//注意这里self没有& error[E0382]: borrow of moved value: `s1` --> src/main.rs:6:20 | 2 | let s1 = String::from("hello"); | -- move occurs because `s1` has type `String`, which does not implement the `Copy` trait 3 | let s2 = String::from(" world"); 4 | let s3 = s1 + &s2; | -- value moved here 5 | println!("{} {}", s2, s3); 6 | println!("{}", s1);//这一行会报错 | ^^ value borrowed here after move |

另外有个问题s2是String类型,&s2是String类型的引用,而我们add方法的第二个参数是字符串切片,不是字符串的引用,为什么这里能编译通过呢?

fn main() { let s1 = String::from("1"); let s2 = String::from("2"); let s3 = String::from("3"); // let s3 = s1 + "-" + &s2 + "-" + &s3; // println!("{}", s3); //比较灵活,不会获取任何参数的所有权 let s = format!("{}-{}-{}", s1, s2, s3); println!("{} {} {} {}", s1, s2, s3, s); }上面是OK的,下面改变下4->3

编译时可以通过的,执行有问题。必须沿着字符边界切割。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值