Если str является «строковым срезом», почему реализации std :: slice не работают на str? - PullRequest
3 голосов
/ 22 июня 2019

В Rust book и docs , str упоминается как срез (в книге они говорят, что срез в String).Итак, я ожидал бы, что str будет вести себя так же, как и любой другой фрагмент: я должен иметь возможность, например, использовать общие реализации из std::slice.Однако, похоже, что это не так:

Хотя это работает, как и ожидалось ( детская площадка ):

fn main() {
    let vec = vec![1, 2, 3, 4];
    let int_slice = &vec[..];
    for chunk in int_slice.chunks(2) {
        println!("{:?}", chunk);
    }
}

Компиляция не удалась: (детская площадка )

fn main() {
    let s = "Hello world";
    for chunk in s.chunks(3) {
        println!("{}", chunk);
    }
}

Со следующим сообщением об ошибке:

error[E0599]: no method named `chunks` found for type `&str` in the current scope
 --> src/main.rs:3:20
  |
3 |     for chunk in s.chunks(3) {
  |                    ^^^^^^

Означает ли это, что str не является обычным срезом?

Если это не так: Какова характеристика str, которая делает невозможным быть срезом?

С другой стороны: если вышеупомянутое является "int срезом", не следует описывать str как"кусок ломтика"?

1 Ответ

3 голосов
/ 22 июня 2019

Документация str начинается с

Тип str, также называемый «срез строки»,

Здесь важны кавычки.str - это «фрагмент строки», который отличается от простого «фрагмента».Они имеют общее имя, потому что они очень похожи, но не связаны друг с другом в противном случае.

Однако вы можете получить обычный фрагмент из 'str', используя as_bytes.Существует также изменяемая версия , которая небезопасна, поскольку вы можете использовать ее для разбивания важного инварианта &str над &[u8]: допустимость UTF-8.

...