Зачем нужна аннотация типа для функции, которая объявляет более общие типы, чем использует? - PullRequest
0 голосов
/ 13 ноября 2018
fn lifetime_tester<A, B, C>(a: Box<A>, b: Box<B>, c: &i32) -> &i32 {
    c
}

fn main() {
    let a = Box::new(String::from("Test1"));
    let b = Box::new(55 as i32);
    let c: i32;
    {
        c = 34 as i32;
    }
    println!("{}", lifetime_tester(a, b, &c));
}

Ошибка:

error[E0282]: type annotations needed
  --> src/main.rs:12:20
   |
12 |     println!("{}", lifetime_tester(a, b, &c));
   |                    ^^^^^^^^^^^^^^^ cannot infer type for `C`

Я сбит с толку из-за того, куда должна идти «аннотация типа».Я указал тип возврата как &i32, указал тип аргумента &i32, а также указал, что c - это i32.

1 Ответ

0 голосов
/ 13 ноября 2018

Поскольку между аргументами вашей функции и универсальным типом C нет никакой связи, компилятор не знает, какой тип вы хотите заменить C в вызове функции. В этом случае ваш код даже не использует тип C, поэтому это не имеет значения, но в Rust важны «локальные рассуждения» - то есть он не заглядывает внутрь вашей функции, чтобы определить, что вы не используете * 1004. * на этапе проверки синтаксиса.

Вы можете явно сказать ему, что ваши типы используют оператор "turbofish", ::<>, например,

println!("{}", lifetime_tester::<_, _, i32>(a, b, &c));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...