跟着谷歌安卓团队学Rust - String vs str

233 阅读2分钟

大家好,我是梦兽编程。欢迎回来与梦兽编程一起刷Rust的系列。

这是由 Google 的 Android开发团队的分享Rust课程。本课程涵盖了 Rust 的方方面面,从基本语法到泛型和错误处理等高级主题。

该课程的最新版本可以在 google.github.io/comprehensi…

如果你喜欢看梦兽编程的版本可以订阅跟着谷歌安卓团队学Rust订阅最新内容,梦兽编程也期待大家关注我的个人网站。

加入梦兽编程微信群juejin.cn/user/206673…

字符串类型

在Rust中有两种字符串类型:

fn main() {
    let s1: &str = "World";
    println!("s1: {s1}");

    let mut s2String = String::from("Hello ");
    println!("s2: {s2}");
    s2.push_str(s1);
    println!("s2: {s2}");

    let s3: &str = &s2[6..];
    println!("s3: {s3}");
}

那这两种字符串有什么区别呢?在java中好像有一个stringbuild差不多的方式去动态修改字符串。你可以类比的理解这个概念。

  • &str一个对字符串切片的不可变引用。
  • String一个可变的字符串缓冲区。

如果你想修改字符串的内容,你应该选择String来定义你的字符串。

我们在看一个例子:

let a = "hello world";
let b = "OK";
let mut s = String::from("Hello Rust");
println!("{}", s.capacity());    // prints 12
s.push_str("Here I come!");
println!("{}", s.len()); // prints 24
let s = "Hello, Rust!";
println!("{}", s.capacity()); // compile error: no method named `capacity` found for type `&str`
println!("{}", s.len()); // prints 12
  • String保留了一个len()和capacity(),但str只有一个len()。
  • &str 是 str的一个的borrowed 类型,可以称为一个字符串切片,一个不可变的string。

关于&String

&String 是String的borrowed类型,这只不过是一个指针类型,可以传递而不放弃ownership。事实上,一个&String可以当做是&str。

fn main() {
    let s = String::from("Hello, Rust!");
    foo(&s);
}
fn foo(s: &str) {
    println!("{}", s);
}

foo()可以使用string slice或者borrowed String类型。

如果我们想修改字符串的内容,只需要传递一个可变引用就行了。

fn main() {
    let mut s = String::from("Hello, Rust!");
    foo(&mut s);
}
fn foo(s: &mut String) {
    s.push_str("appending foo..");
    println!("{}", s);
}

相互转换

&str => String

let c = a.to_string();
let d = String::from(b);
let d = a.to_owned();

String => &str

let e = &String::from("Hello Rust");
// 或使用as_str()
let e_tmp = String::from("Hello Rust");
let e = e_tmp.as_str();
// 不能直接这样使用 
// let e = String::from("Hello Rust").as_str();

String + &str => String

String后面接上N个&str

let mut strs = "Hello".to_string();
// let mut strs = String::from("Hello");
strs.push_str(" Rust");
println!("{}", strs);

总结

如果只想要一个字符串的只读视图,或者&str作为一个函数的参数,那就首选&str。如果想拥有所有权,想修改字符串那就用String吧。

微信搜索梦兽编程公众号

参考资料

[1]

google.github.io/comprehensi…: google.github.io/comprehensi…

本文使用 markdown.com.cn 排版