2016-04-03 2 views
12

Несколько раз я использовал неправильный синтаксис, например, забывая использовать let в этом примере:Что такое тип записи?

let closure_annotated = |value: i32| -> i32 { 
    temp: i32 = fun(5i32); //<-- Error 
    temp + value + 1 
}; 
error: type ascription is experimental (see issue #23416) 
      temp: i32 = fun(5i32); //<-- Error 
      ^~~~~~~~~ 

Я знаю, что эта проблема решается с помощью let, но может кто-то объяснить, что такое «тип приписывание «есть и что использовать?

Я нашел issue #23416 и the feature gate for type ascription, но я не мог найти ничего, чтобы понять, что такое «тип записи» и какова его цель.

ответ

22

Тип приписывания - это возможность комментировать выражение с типом, который мы хотим иметь. Типовой порядок в Rust описан в RFC 803.

В некоторых ситуациях тип выражения может быть неоднозначным. Например, этот код:

fn main() { 
    println!("{:?}", "hello".chars().collect()); 
} 

дает следующее сообщение об ошибке:

<anon>:2:38: 2:47 error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282] 
<anon>:2  println!("{:?}", "hello".chars().collect()); 
               ^~~~~~~~~ 

Это потому, что метод collect может возвращать любой тип, который реализует FromIterator черты для Item типа итератора. С типа атрибуции, можно было бы написать:

fn main() { 
    println!("{:?}", "hello".chars().collect(): Vec<char>); 
} 

Вместо тока (от Rust 1.7) способов неоднозначности это выражение:

fn main() { 
    println!("{:?}", "hello".chars().collect::<Vec<char>>()); 
} 

или:

fn main() { 
    let vec: Vec<char> = "hello".chars().collect(); 
    println!("{:?}", vec); 
} 
+0

спасибо очень много для объяснения и ссылки –

+1

Еще один пример * лучше * 'Into'; потому что параметр типа есть параметр * trait *, * невозможно * аннотировать вызов метода .into() 'для указания типа. Вы должны переписать выражение, чтобы вместо этого использовать вызов с аннотированной функцией. –

+0

'Это потому, что метод collect может возвращать любой тип, который реализует FromIterator', но зачем ему возвращать что-либо, кроме типа« chars() »? –