我正在阅读Rust书,而第4章中的参考和借阅似乎与我不一致。
在Reference and Borrowing中,下面的图4-5显示s
指向s1
而不是堆上的实际数据。
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("The length of '{}' is {}.", s1, len);
}
fn calculate_length(s: &String) -> usize {
s.len()
}
但是在String Slices中,该图清楚地表明world
引用了实际数据,尽管只是其中的一部分。它还说,以下代码“类似于对整个String的引用,但具有额外的[0..5]位。它不是对整个String的引用,而是对String的一部分的引用。”
fn main() {
let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6..11];
}
现在我想我的问题是,在“字符串切片”案例中,为什么world
不是指s
?我了解world
不能仅指向s
,因为那样一来它就无法获取最后5个字母。但是,这两个图对我来说似乎完全不同,但是它们都是“参考”。有人可以提供一种逻辑的方式来理解它吗?
谢谢!
答案 0 :(得分:0)
那么,&[mut] String
在安全的上下文中有什么保证?
String
,因此支持您的第一个图表。 那么,&[mut] str
在安全上下文中可以保证什么?
String
相同的想法是,指针后面有str
。但是,这是什么意思? str
到底是什么?根据文档页面:
&str由两个部分组成:一个指向某些字节的指针和一个长度。
意思是&str
确实是指向某个有效utf-8和长度的指针,所以str
实际上是数据本身,而不是 String
。 String
可以视为可操作的str
。因此,&my_string[..]
实际上是指向String
下数据的指针/引用。
答案 1 :(得分:0)
对字符串和字符串切片的引用是不同的东西,因此以不同的方式表示它们是正常的。
大多数情况下,字符串切片会更有用,因为您可以引用子字符串,这使它更灵活。通常,用于读取某些字符串数据的函数参数应该是字符串切片,而不是对字符串的引用。
另外,you can use an actual parameter of type &String
for a string slice:
字符串实现Deref,因此继承了所有str的 方法。此外,这意味着您可以将String传递给 该函数使用&符(&)来获取&str
使用切片无法做的一件有用的事情是增加字符串的大小,在这种情况下,您需要对字符串的可变引用。 read_line
函数就是一个示例,该函数将字符串数据附加到buf
:
pub fn read_line(&self, buf: &mut String) -> Result<usize>