Почему тип Split возвращает только & str, хотя в Pattern есть реализации для & str и char? - PullRequest
0 голосов
/ 14 мая 2018

Мне трудно понять, как работает тип Split в Rust.

Split<'a, P> where P: Pattern<'a> - это тип, возвращаемый методом std::string::String::split. Тип имеет реализацию для Iterator<'a, P>, где P по-прежнему является типом Pattern, но в действительности (и, как я ожидал), Iterator возвращает только &str фрагментов.

Например, split(p).collect::<Vec<&str>>() работает, но split(p).collect::<Vec<char>>() приводит к ошибке компиляции. Это то, чего я ожидал бы, но я не понимаю, как это происходит, поскольку Pattern имеет реализации как для &str, так и для char.

Почему тип Split не определяется просто как Split<'a, &'a str>, поскольку он фактически Iterator более &str с? Почему он ведет себя так, как будто он так определен?

1 Ответ

0 голосов
/ 14 мая 2018

Тип имеет реализацию для Iterator<'a, P>

Это не так.Это просто Iterator, который не имеет параметров типа.Каждая реализация Iterator должна объявлять тип элемента, который она повторяет, используя связанный тип.Например, реализация Split [1] выглядит примерно так:

impl <'a, P> Iterator for Split<'a, P> {
    type Item = &'a str;
    fn next(&mut self) -> Option<&'a str> { ... }
}

Почему тип Split не определяется просто как Split<'a, &'a str>, поскольку это фактически Iterator более &str с?

Потому что итераторы ленивы.Структура Split все еще должна знать о шаблоне, чтобы соответствовать следующему элементу.Его экземпляр итератора имеет Item = &str, потому что это то, что он повторяет.


[1] Фактическая реализация - , сгенерированная макросом .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...