Я читаю книгу Rust, и ссылки и заимствования в главе 4 кажутся мне противоречивыми.
В Ссылка и заимствование на рисунке 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
ссылается на фактические данные, хотя и только на их часть. В нем также говорится, что следующий код «похож на взятие ссылки на всю строку, но с дополнительным битом [0..5]. Вместо ссылки на всю строку, это ссылка на часть строки».
fn main() {
let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6..11];
}
А вот схема (рисунок 4-6), которая объясняет приведенный выше код:
Теперь я предполагаю, что мой вопрос заключается в том, почему world
не относится к s
в случае строковых фрагментов? Я понимаю, что world
не может просто указывать на s
, потому что тогда он не сможет получить последние 5 букв. Но эти две диаграммы кажутся мне совершенно разными, но все они являются «ссылками». Может кто-нибудь предоставить логичный способ понять это?
Спасибо!