2017-02-02 9 views
3

Удивительно трудно найти это в документах. Это может быть даже две части вопроса:Что такое {целое число} в сообщении об ошибке компилятора?

  1. {integer} Является ли какой-то языковой псевдоним для конкретного примитивного типа?

  2. Что означает, что имя типа заключено в фигурные скобки в сообщение об ошибке компиляции/синтаксиса?

Пример:

error: no method named pow found for type {integer} in the current scope

+2

Связанный вопрос: [Когда числовые литералы назначаются типам по умолчанию?] (Http://stackoverflow.com/questions/39595782/when-are-numeric-literals-assigned-to-default-types). – ljedrz

ответ

8

{integer} - целое значение, конкретный тип которого не был указан и еще не был выведен компилятором; следующий код:

fn main() { 
    let x = 1; 
    let() = x; 
} 

приведет к следующей ошибке:

error[E0308]: mismatched types 

--> <anon>:3:9 
    | 
3 |  let() = x; 
    |   ^^ expected integral variable, found() 
    | 
    = note: expected type `{integer}` 
    = note: found type `()` 

То же самое случилось бы с плавающим номер:

fn main() { 
    let x = 1.0; 
    let() = x; 
} 
error[E0308]: mismatched types 
--> <anon>:3:9 
    | 
3 |  let() = x; 
    |   ^^ expected floating-point variable, found() 
    | 
    = note: expected type `{float}` 
    = note: found type `()` 

Поскольку ошибка компиляции, вызванные недопустимое присвоение let() = x бросается до того, как произойдет вывод типа.

Другими словами, пока компиляция не достигает стадии вывода типа, где целое число или число с плавающей точкой без конкретного типа, указанного была бы признана (например, основанные на применении функции) или назначенный по умолчанию тип, i32 для целых чисел и f64 для поплавков , ошибки компиляции будут относиться к нему как {integer} или {float}.

+0

Примечание: назначение 'let() = x' является полезным способом определения типа переменной: [связанный вопрос SO] (http://stackoverflow.com/questions/21747136/how-do-i-print- заместитель типа-а-переменный-в-ржавчины). – ljedrz

+0

Вот как я наткнулся на эту ошибку. Была попытка повысить значение, которое я только что извлек из хэш-карты, но только вставлял числовые литералы в эту хэш-карту (работая через Rust Koans), предоставляя компилятору никакой информации о том, какой конкретный числовой тип использовать, а затем пытается чтобы принудить эти ценности к произвольным типам, чтобы выяснить, какой тип я пытался противопоставить. Еще одна часть головоломки защелкнулась. –

7

{integer} в сообщениях об ошибках является заполнителем для любой из целочисленных типов ({i,u}{8,16,32,64,128}). (Source)

Целочисленные литеры в ржавчине имеют тип, исходящий от их использования. Например, в следующем коде, тип 123 является u8 в первом случае и u64 во втором:

let a: u8 = 123; 
let a: u64 = 123; 

{integer} используются для представления любого типа целого в сообщениях об ошибках, когда компилятор не поняли, конкретный тип значения.