English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Rust 基礎文法

变量,基本类型,函数,注释和控制流,这些几乎是每种编程语言都具有的编程概念。

这些基础概念将存在于每个 Rust 程序中,及早学习它们将使你以最快的速度学习 Rust 的使用。

变量

首先必须说明,Rust 是强类型语言,但具有自动判断变量类型的能力。这很容易让人与弱类型语言产生混淆。

如果要声明变量,需要使用 let 关键字。例如:

let a = 123;

只学习过 JavaScript 的开发者对这句话很敏感,只学习过 C 语言的开发者对这句话很不理解。

在这句声明语句之后,以下三行代码都是被禁止的:

a = "abc";
a = 4.56; 
a = 456;

第一行的错误在于当声明 a 是 123 从今以后,a 就被确定为整型数字,不能把字符串类型的值赋给它。

第二行的错误在于自动转换数字精度有损失,Rust 语言不允许精度有损失的自动数据类型转换。

第三行的错误在于 a not a mutable variable。

前两种错误很容易理解,但 the third is what does it mean? Does a not a variable?

これはRust言語が高並行性の安全性のために行ったデザインに関連しています:言語レベルでできるだけ変数の値を変更するのを少なくします。したがって、aの値は不可変です。しかし、aが「変数」(英語ではvariable)でないという意味ではありません。公式文書では、aのような変数を「不可変変数」と呼びます。

もし私たちが書いたプログラムの一部が値が決して変わりないと仮定して動作し、そしてコードの別の部分がその値を変更する場合、コードの第一部分は設計した通りに動作しないかもしれません。このような理由で発生するエラーは後で難しいことがあります。これがRust言語がこのメカニズムを設計する理由です。

もちろん、変数を「可変」(mutable)にするには mut キーワードが一つだけ必要です。

let mut a = 123;
a = 456;

このプログラムは正しいです。

定数と不可変変数の違い

不可変変数は不可変であるため、それが常量ではありませんか?なぜ変数と呼ぶのでしょうか?

変数と定数には違いがあります。Rustでは以下のプログラムは合法です:

let a = 123;
let a = 456;

しかし、aが定数の場合は合法ではありません:

const a: i32 = 123;
let a = 456;

変数の値は「再バインド」することができますが、再バインドの前に変更することはできません。これにより、各「バインド」の後の範囲でコンパイラがプログラムのロジックを十分に推論できることを確保します。 Rustは自動的な型判定機能がありますが、ある場合には型宣言が便利です:

let a: u64 = 123;

ここではaを無符号として宣言しています 64 ビット整数変数、型が宣言されていない場合、aは自動的に符号付きと判断されます。 32 ビット整数変数、これはaの値範囲に大きな影響を与えます。

重影(Shadowing)

重影の概念は、他の面向オブジェクト言語の「オーバーライド」または「オーバーロード」とは異なります。重影は先ほど述べた「再バインド」というものです。引用符を使うのは、この概念をまだ紹介していない場合にその概念を代用するためです。

重影とは、変数の名前が再利用できるメカニズムを指します:

fn main() {
    let x = 5;
    let x = x + 1;
    let x = x * 2;
    println!("xの値は:{}", x);
}

このプログラムの実行結果:

xの値は: 12

重影と可変変数の割り当ては同じ概念ではありません。重影とは、同じ名前で別の変数エンティティを再代表するもので、型、可変属性、値が変えられることができます。しかし、可変変数の割り当ては値の変更のみが発生します。

let mut s = "123";
s = s.len();

このプログラムはエラーが発生します:文字列変数に整数値を割り当てることができません。