Почему аргумент & [T] также принимает & Vec <T>? - PullRequest
0 голосов
/ 08 мая 2018

Я работаю через книгу Rust, а именно мини-репроект . Там я наткнулся на следующий фрагмент:

fn main() {
    let args: Vec<String> = env::args().collect();

    let (query, filename) = parse_config(&args);

    // --snip--
}

fn parse_config(args: &[String]) -> (&str, &str) {
    let query = &args[1];
    let filename = &args[2];

    (query, filename)
}

Запутанная вещь для меня - args: &[String]. Если я заменю его на args: &Vec<String>, это тоже работает. Я предполагаю, что &[String] - это более общая аннотация типа, которая соответствует не только &Vec<String>, но и некоторым другим типам. Это верно? Если да, то какие другие типы соответствуют [T]?

1 Ответ

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

Вообще говоря, [T] - это непрерывная последовательность, а &[T] - это срез .

Причина, по которой компилятор допускает &[String] вместо &Vec<String>, заключается в том, что Vec<T> разыменовывает [T]. Можно сказать, что первое обозначение (в параметрах функции) является более общим; это также предпочтительный . Более подробную информацию об автоматических правилах разыменования можно найти в этом вопросе .

...