削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
s/データ/データー/3 https://ja.wikipedia.org/wiki/%E9%95%B7%E9%9F%B3%E7%AC%A6#%E9%95%B7%E9%9F%B3%E7%AC%A6%E3%82%92%E4%BB%98%E3%81%91%E3%82%8B%E6%B5%81%E5%84%80%E3%83%BB%E4%BB%98%E3%81%91%E3%81%AA%E3%81%84%E6%B5%81%E5%84%80
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎変数とミュータブル・イミュータブル: let と mut の混同。同じ変数名での宣言によって、それまで変数に束縛されていた値への参照がなくなります。
タグ: 2017年版ソースエディター
92 行
 
=== 変数とミュータブル・イミュータブル ===
Rustでは、変数を宣言するにはキーワード '''let'''を使いますが、
ディフォルトでつくられるの[[#イミュータブル|イミュータブル]](''Immutable'';作成宣言後には変更代入不能)な変数が宣言されます。
[[#ミュータブル|ミュータブル]](''Mutable'';作成宣言後にも変更代入可能)な変数を宣言するには、追加のキーワード '''mut''' を使います。
 
;[https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=9032ae8999c6cb3bf5412988320e50d7 hello-variables.rs]:<syntaxhighlight lang=rust highlight=2 line>
105 ⟶ 106行目:
</syntaxhighlight>
:2行目の<syntaxhighlight lang=rust inline>let hello : &str = "Hello, world!";</syntaxhighlight>が変数宣言です<ref>文字リテラルであることを強調するなら<syntaxhighlight lang=rust inline>let hello : &'static str = "Hello, world!";</syntaxhighlight>とすべきだったかもしれません。</ref>。
::&str(文字列のスライスのリファレンスであ)を型とする変数 <var>hello</var> を宣言し、"Hello, world!"で初期化しています。
::Rustには強力な[[#型推論|型推論]]があり多くの場合不要ですが、<code>let 変数名 : 型名</code>の書式で型を伴い変数宣言することも出来ます。
 
letmut をつけない場合には作成後変数に「代入」と聞くと、C言語などを知っている人は「定数」を思い浮かべるかもしれません。ですが、rustにおける「定数」については const キーワードが別途、存在しています。
::「&str」とは文字列型の一種です。この場合、<nowiki>&</nowiki>も含めて型名です。なので、ほかの型では<nowiki>&</nowiki>がつかない場合もあります。rustでは型なしでも宣言できる場合もありますが、型をつける場合には<code>let 変数名 : 型名</code>の順序で宣言します。
Rustにおいて「定数」は, const 宣言された定数や, static 宣言されかつ mut で修飾されていない変数が相当します。
 
 
let をつけない場合には作成後に「不変」と聞くと、C言語などを知っている人は「定数」を思い浮かべるかもしれません。ですが、rustにおける「定数」については const キーワードが別途、存在しています。
 
==== 型推論 ====
Rust では、変数宣言が初期値を伴っていた場合、変数の型を省略することができ、初期値場合は型が変数の型が初期値の型になります。
;[https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=8955af79cf1040655600a846791d149b hello-type-inference.rs]:<syntaxhighlight lang=rust highlight=2 line>
fn main() {
151 行
 
==== ミュータブル ====
代入可能、すなわちミュータブルにするためには、変数宣言にあたり '''let''' に続けて '''mut''' をつけます
;[https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=f795ca7bd93cb23a75f77654cee1068b hello-mutable.rs]:<syntaxhighlight lang=rust highlight=2 line>
fn main() {
165 行
</syntaxhighlight>
 
==== シャドーイング同じ変数名での宣言 ====
度mutなしスコープ宣言した同じ変数も、再度letを使って宣言しなおすことは可能で、初期化がもう一度できます。
同じ型である必要はありません。ミュータブルであるかイミュータブルであるかも問いません。
このことを、シャドーイングと言います。また、「新しい宣言によって、前の宣言が覆い隠された (shadowed) 」のように言います。
シャドーイング'''同じ変数名での宣言によって、それまで変数に束縛されていた値への参照がなくなります。'''
 
;[https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=ab6955620ffb9be1841da5f925a16803 同じ変数名での宣言]:<syntaxhighlight lang=rust highlight='2,4' line>
fn main() {
let hello : &str = "Hello, world!";
println!("{}", hello);
let hello = "Hello, rust!"154649;
println!("{}", hello);
}</syntaxhighlight>
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
Hello, world!
154649
Hello, rust!
</syntaxhighlight>