来自source:
pub struct String {
vec: Vec<u8>, // <- ?
}
impl String {
// ...
pub fn new() -> String {
String { vec: Vec::new() } // <- ?
}
// ...
}
答案 0 :(得分:8)
是和否。 String
用于保存其数据的基础缓冲区为Vec
。这是有道理的,因为通常你想要字符串和向量的类似分配策略。在String
impl中手动完成所有分配将浪费时间和大量重复代码。
但请注意,vec
字段是私有的,因此您无法直接访问它(仅使用安全方法)。这意味着(安全)String
接口可以在向量中强制执行有效的UTF8数据。
但是:String
只是围绕某种缓冲区的UTF8强制包装。
在Rust 1.0发布之前有一个相当长的讨论关于是否通过接口公开这个内部向量。讨论的结果是保留有问题的方法as_mut_vec
。在某些情况下,这种方法当然很方便,但是后来无法改变字符串的实现。