Почему в ржавчине s[0..] возвращает тип `str`?

В моем понимании s[0..] вызывает метод ops::Index::index. Я пытаюсь вызвать s.index(0..), но обнаруживаю, что он возвращает тип &str. Код выглядит следующим образом

let a = String::from("hello world");
let b = &a;
let c = b.index(1..);
println!("{}", c);
let d = b[1..];
println!("{}", d);

Этот код отобразит ошибку и укажет, что переменная d имеет тип str.

Что я неправильно понимаю? и как понять [] и index() в ржавчине?

что еще вы хотите, чтобы он вернулся?

Stargateur 11.02.2023 14:52
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
1
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В документации std::ops::Index находим:

container[index] на самом деле синтаксический сахар для *container.index(index)

и

Это позволяет делать такие приятные вещи, как let value = v[index], если тип value реализует Copy.

В вашем примере c имеет тип &str, как вы ожидаете, но d будет разыменованием (*) такого &str; это приведет к str, который отклоняется компилятором (не по размеру).

Чтобы получить &str в d, вы можете написать:

let d = &b[1..]; // & was missing

что действительно явно, потому что ясно сказано: «Я хочу сослаться на что-то, что стоит внутри b».

Вот еще один пример неявного разыменования (*) в другом контексте:

let mut arr = [1, 2, 3, 4];
let n = arr[1]; // not *arr[1]
arr[2] += n; // not *arr[2]
println!("{:?}", arr); // [1, 2, 5, 4]

Другие вопросы по теме