为什么Rust有String和str?String和str之间有什么区别?什么时候使用String而不是str,反之亦然?其中一个被弃用了吗?
当前回答
简单地说,String是存储在堆上的数据类型(就像Vec一样),您可以访问该位置。
&str是一种切片类型。这意味着它只是对堆中某个已经存在的String的引用。
&str在运行时不进行任何分配。因此,出于内存原因,可以在字符串上使用&str。但是,请记住,在使用&str时,您可能需要处理显式的生存期。
其他回答
在Rust中,str是一种表示Unicode标量值序列的原始类型,也称为字符串切片。这意味着它是字符串的只读视图,它不拥有它所指向的内存。另一方面,string是一种可增长的、可变的、拥有的字符串类型。这意味着当您创建字符串时,它将在堆上分配内存以存储字符串的内容,并且当字符串超出范围时,它会释放该内存。因为String是可增长的和可变的,所以您可以在创建String之后更改它的内容。
通常,str在您想要引用存储在另一个数据结构(如string)中的字符串片段时使用。当您想要创建和拥有字符串值时,使用字符串。
锈蚀和字符串(&S)
字符串:
Rust拥有String类型,字符串本身存在于堆中,因此是可变的,可以更改其大小和内容。因为当拥有字符串的变量超出范围时,String是被拥有的,所以堆上的内存将被释放。String类型的变量是胖指针(指针+相关元数据)fat指针长度为3*8字节(字大小),由以下3个元素组成:指向堆上实际数据的指针,它指向第一个字符字符串长度(字符数)堆上字符串的容量
&字符串:
Rust非拥有的String类型,默认情况下是不可变的。字符串本身位于内存中的其他位置,通常位于堆或“静态内存”中。因为当&str变量超出范围时,字符串是非所有的,所以字符串的内存不会被释放。&str类型的变量是胖指针(指针+相关元数据)fat指针长度为2*8字节(字大小),由以下2个元素组成:指向堆上实际数据的指针,它指向第一个字符字符串长度(字符数)
例子:
use std::mem;
fn main() {
// on 64 bit architecture:
println!("{}", mem::size_of::<&str>()); // 16
println!("{}", mem::size_of::<String>()); // 24
let string1: &'static str = "abc";
// string will point to `static memory which lives through the whole program
let ptr = string1.as_ptr();
let len = string1.len();
println!("{}, {}", unsafe { *ptr as char }, len); // a, 3
// len is 3 characters long so 3
// pointer to the first character points to letter a
{
let mut string2: String = "def".to_string();
let ptr = string2.as_ptr();
let len = string2.len();
let capacity = string2.capacity();
println!("{}, {}, {}", unsafe { *ptr as char }, len, capacity); // d, 3, 3
// pointer to the first character points to letter d
// len is 3 characters long so 3
// string has now 3 bytes of space on the heap
string2.push_str("ghijk"); // we can mutate String type, capacity and length will aslo change
println!("{}, {}", string2, string2.capacity()); // defghijk, 8
} // memory of string2 on the heap will be freed here because owner goes out of scope
}
字符串是一个Object。
&str是对象的一部分的指针。
这里有一个简单快捷的解释。
字符串-可增长的、可拥有的堆分配数据结构。它可以强制为&str。
str是(现在,随着Rust的发展)可变的固定长度字符串,存在于堆或二进制文件中。只能通过字符串切片视图(如&str)将str作为借用类型进行交互。
使用注意事项:
如果您想拥有或变异字符串,请首选字符串,例如将字符串传递给另一个线程等。
如果希望字符串的只读视图,请首选&str。
str,仅用作&str,是一个字符串片段,是对UTF-8字节数组的引用。
字符串过去是~str,一个可增长的、拥有的UTF-8字节数组。
推荐文章
- Printf与std::字符串?
- 不区分大小写的“in”
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 如何在PHP中截断字符串最接近于一定数量的字符?
- Ruby数组到字符串的转换
- 为什么在Java和。net中不能修改字符串?
- 如何创建一个日期对象从字符串在javascript
- 在Android上将字符串转换为整数
- 删除字符串的最后3个字符
- 如何大写一个字符串的第一个字母在省道?
- 不区分大小写的列表排序,没有降低结果?
- indexOf()和search()的区别是什么?
- 我如何用Cargo构建多个二进制文件?
- 我如何在Swift连接字符串?
- 如何获得一个变量值,如果变量名存储为字符串?