跳到主要内容

原始类型

原始类型是一些简单值,Move 内置了许多原始类型,他们是构成所有其他类型的基础。这些原始类型包括:

  • 布尔值
  • 无符号整数
  • 地址

不过,在讨论类型之前,我们首先看看如何在 Move 中声明和赋值变量。

变量和赋值

变量使用 let 关键字声明。默认情况下它们是不可变的,但可以使用 let mut 关键字使其可变。let mut 语句的语法如下:

let <变量名>[: <类型>] = <表达式>;
let mut <变量名>[: <类型>] = <表达式>;

其中:

<变量名> - 变量的名称
<类型> - 变量的类型,可选的
<表达式> - 要分配给变量的值
let x: bool = true;
let mut y: u8 = 42;

可变变量可以使用 = 运算符重新赋值。

y = 43;

变量还可以通过重新声明进行隐藏。

let x: u8 = 42;
let x: u16 = 42;

布尔类型

bool 类型表示布尔值 - 是或否、真或假。它有两个可能的值:true 和 false,它们在 Move 中是关键字。对于布尔值,无需显式指定类型 - 编译器可以从值中推断出来。

let x = true;
let y = false;

布尔类型经常用于存储标志和控制程序的流程。更多信息,请参阅控制流部分。

整数类型

Move 支持各种大小的无符号整数:从 8 位到 256 位。整数类型包括:

  • u8 - 8 位
  • u16 - 16 位
  • u32 - 32 位
  • u64 - 64 位
  • u128 - 128 位
  • u256 - 256 位
let x: u8 = 42;
let y: u16 = 42;
// ...
let z: u256 = 42;

与布尔类型不同,整数类型需要推断。在大多数情况下,编译器将从值中推断出类型,通常默认为 u64。但有时编译器无法推断类型,将需要显式的类型标注。可以在赋值时提供或使用类型后缀。

// Both are equivalent
let x: u8 = 42;
let x = 42u8;

运算

Move 支持整数的标准算术运算:加法、减法、乘法、除法和取余。这些操作的语法如下:

SyntaxOperationAborts If
+additionResult is too large for the integer type
-subtractionResult is less than zero
*multiplicationResult is too large for the integer type
%modular divisionThe divisor is 0
/truncating divisionThe divisor is 0

For more operations, including bitwise operations, please refer to the Move Reference.

操作数的类型必须匹配,否则编译器将报错。操作的结果将与操作数相同类型。要对不同类型执行操作,需要将操作数转换为相同类型。

使用 as 进行类型转换

Move 支持整数类型之间的显式转换。其语法为:

<expression> as <type>

注意,可能需要在表达式周围加上括号以避免歧义。

let x: u8 = 42;
let y: u16 = x as u16;
let z = 2 * (x as u16); // ambiguous, requires parentheses

一个更复杂的例子,防止溢出:

let x: u8 = 255;
let y: u8 = 255;
let z: u16 = (x as u16) + ((y as u16) * 2);

溢出

Move 不支持溢出/下溢,导致值超出类型范围的操作将引发运行时错误。这是为了防止意外行为的安全特性。

let x = 255u8;
let y = 1u8;

// This will raise an error
let z = x + y;