2016-06-17 14 views
11

変数がmutを使って明示的に変更可能であると宣言されていないと、変数が変更不能になります(宣言後は変更できません)。では、なぜRustにconstというキーワードがありますか?彼らは同じではありませんか?そうでない場合は、どう違いますか?Rustの不変変数とconst変数の違いは何ですか?

答えて

11

const、さびで、一定の略であり、コンパイル時の評価に関連しています。それが現れる:

  • 宣言定数:const FOO: usize = 3;
  • 宣言コンパイル時の評価関数:値のconst fn foo() -> &'static str

これらの種類は、一般的なパラメータとして使用することができる:[u8; FOO]。今のところこれは配列の大きさに制限されていますが、今後さらに拡張する予定の話、計画、希望があります。対照的に、letバインディングは、実行時の計算値とほぼ同じです。

可変性の概念がよく知られているので、mutが使用されていますが、Rustは実際にここにあります。 &T&mut Tはエイリアシングではなく、可変性について、次のとおりです。

  • &T:共有参照
  • &mut T:ユニーク参照

最も顕著なのは、いくつかの種類が内部可変性を特長としており(&Tを経由して突然変異させることができます共有参照):CellRefCellMutexなど


注:ここで説明されていない生のポインタ(*mut T*const T)とmutconstの代替使用があります。

1

constはすべてが伴うコンパイル時定数です。たとえば、サイズがconstの固定サイズの配列を作成することはできますが、letバインドではできません。もちろん、これはconstよりもはるかに多くのものをletバインディングに入れることができることを意味します。

8

constは変数ではありません。それはどこにも格納されないかもしれない一定の値のためです。彼らは実質的にはリテラル値のエイリアスです。いくつかのケースで(それは例えば、Cellメンバーが含まれている場合)

mutletは、実行時に作成された実際の変数は、内部可変性を持っていても、移動することができる(そして、もはやアクセス可能)、および宣言していません。

0

定数を再定義することはできません。

let x = 10u32; 
const Y:u32 = 20u32; 

let x = 11u32; 
//error: duplicate definition of value `Y` [E0428] 
//const Y:u32 = 21u32; 

println!("x={} Y={}",x,Y); //x=11 Y=20 
関連する問題