Rust中的String VS str

栏目: 编程语言 · Rust · 发布时间: 6年前

内容简介:最近在写C++,业余时间在学习Rust,这好像是我第二次学了,第一次学习对有的概念还是很懵逼的,最近写了C++之后,好多东西理解起来不是那么吃力了,里面的概念超级多,好记性不如烂笔头,还是记录一下吧。在Rust的官方文档References and Borrowing [首先看一下str 和 String之间的区别:String是一个可变的、堆上分配的UTF-8的字节缓冲区。而str是一个不可变的固定长度的字符串,如果是从String解引用而来的,则指向堆上,如果是字面值,则指向静态内存。

最近在写C++,业余时间在学习Rust,这好像是我第二次学了,第一次学习对有的概念还是很懵逼的,最近写了C++之后,好多东西理解起来不是那么吃力了,里面的概念超级多,好记性不如烂笔头,还是记录一下吧。

在Rust的官方文档References and Borrowing [ https://doc.rust-lang.org/book/second-edition/ch04-02-references-and-borrowing.html ] 用到了三种不同类型的string变量:String,&String 和 &str

首先看一下str 和 String之间的区别:String是一个可变的、堆上分配的UTF-8的字节缓冲区。而str是一个不可变的固定长度的字符串,如果是从String解引用而来的,则指向堆上,如果是字面值,则指向静态内存。

举例说明 String 和 &str

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
  • 上面的a, b 是&str,不是String,&str更像一个固定的数组,String像一个可变的数组。

  • 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吧。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序是怎样跑起来的

程序是怎样跑起来的

[日] 矢泽久雄 / 李逢俊 / 人民邮电出版社 / 2015-4 / 39.00元

本书从计算机的内部结构开始讲起,以图配文的形式详细讲解了二进制、内存、数据压缩、源文件和可执行文件、操作系统和应用程序的关系、汇编语言、硬件控制方法等内容,目的是让读者了解从用户双击程序图标到程序开始运行之间到底发生了什么。同时专设了“如果是你,你会怎样介绍?”专栏,以小学生、老奶奶为对象讲解程序的运行原理,颇为有趣。本书图文并茂,通俗易懂,非常适合计算机爱好者及相关从业人员阅读。一起来看看 《程序是怎样跑起来的》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具