编译器错误信息中的{整数}或{浮点数}是什么?

12

在文档中找到这个信息实际上相当困难,这甚至可能是一个由两部分组成的问题:

  1. {integer}{float}是否是某种特定原始类型的语言别名?

  2. 类型名称用花括号括起来在编译/语法错误消息中表示什么意思?

例如:

错误:没有在当前作用域找到名为pow的方法,类型为{integer}


2个回答

11

{integer}在错误信息中是一个占位符,可以代表任何整数类型({i,u}{8,16,32,64,128})。(来源)

Rust中的整数字面量根据其使用进行类型推导。例如,在以下代码中,123在第一次出现时类型为u8,在第二次出现时类型为u64

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

{integer} 通常在编译器无法确定数值具体类型时,用于表示任何整数类型的错误信息。


1
{integer} 也可以强制转换为类型 usize - Nayuki

11

{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 引起的编译错误会在类型推断之前抛出。

换句话说,在编译到类型推断阶段之前,整数或浮点数如果没有具体类型指定,将被认为是一个 {integer}{float}(例如基于函数应用),或分配默认类型,即整数的i32和浮点数的f64,编译错误将以此为参照。


1
注意:let () = x 赋值是确定变量类型的有用方法:相关 SO 问题 - ljedrz
这就是我意外发现这个错误的本质。当时我正在试图对从哈希映射中检索到的一个值进行指数运算,但之前我只向该哈希映射插入了数字字面量(通过 Rust Koans 练习),没有提供具体的数字类型给编译器,结果想要强制将这些值转换为任意类型以确定我尝试编写的类型。这又是拼图中的另一块。 - user74754

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接