[英]Explanation on References and Borrowing from The Rust book
我正在读Rust书,第4章中的References和Borrowing似乎与我不一致。 在Reference和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];
}
现在我想我的问题是为什么在String Slices案例中world
没有引用s
? 我知道world
不能仅仅指向s
因为它无法获得最后5个字母。 但这两个图似乎与我完全不同,但它们都是“参考”。 有人可以提供合理的方式来理解它吗?
谢谢!
那么, &[mut] String
在安全的上下文中保证什么?
String
,因此支持你的第一个图表。 那么, &[mut] str
在安全的环境中保证什么呢?
String
相同的想法,指针后面有一个str
。 但是,这是什么意思? 什么是str
? 根据文档页面:
A&str由两个组件组成:指向某些字节的指针和一个长度。
意思是, &str
确实是指向某个有效的utf-8和一个长度的指针,所以实际上, str
是数据本身,而不是 String
。 String
可以被视为可操作的str
。 所以&my_string[..]
实际上是String
下数据的指针/引用。
对字符串和字符串切片的引用是不同的东西,因此以不同方式表示它们是正常的。
大多数情况下,字符串切片更有用,因为您可以引用子字符串,这使其更加灵活。 通常,用于读取某些字符串数据的函数参数应该是字符串切片而不是对字符串的引用。
此外, 您可以为字符串切片使用类型&String
的实际参数 :
字符串实现Deref,因此继承了str的所有方法。 另外,这意味着你可以将一个String传递给一个函数,该函数使用&符号来获取&str(&)
切片无法做到的一件有用的事情是增加字符串的大小,在这种情况下,您需要对字符串进行可变引用。 一个例子是read_line
函数,它将字符串数据附加到buf
:
pub fn read_line(&self, buf: &mut String) -> Result<usize>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.