Rust以外の言語でイミュータブルな変数の値を書き換えると、どのような挙動を起こすのか?
変数の値をミュータブルやイミュータブルに変更できる言語はRust以外にも数多くあると思いますが、これらの言語でイミュータブルな変数を外部から書き換える場合は、どのような挙動を起こすのでしょうか?「外部から書き換える」とはRustで表すとこんな感じです。
//スケッチ1
fn main() {
let x = 1;
println!("変数の値は{}", x);
x = 2; //ここで直接ではなく、外部から書き換えている。
println!("新し変数の値は{}", x);
}
公式ドキュメントによると、
<中略>なぜなら、この状況はまさしく、バグに繋がるからです。コードのある部分は、 値が変わることはないという前提のもとに処理を行い、別の部分がその値を変更していたら、 最初の部分が目論見通りに動いていない可能性があるのです。このようなバグの発生は、 事実(訳注:実際にプログラムを走らせた結果のことと思われる)の後には追いかけづらいものです。 特に第2のコード片が、値を時々しか変えない場合尚更です。
参照URL(https://doc.rust-jp.rs/book/second-edition/ch03-01-variables-and-mutability.html#a変数と可変性)
という解説がなされていていますが、少々わからない事があります。というのも私自身が設計思想上ゆるい部類の言語であるRubyでプログラムの組まれ方学んだ人間なので、そもそもミュータブル・イミュータブルを採用した言語への理解が進んでいないというのが現状で、よって、
値が変わることはないという前提のもとに処理を行い、別の部分がその値を変更していたら、 最初の部分が目論見通りに動いていない可能性があるのです。
の記述のイメージが少々つきにくい部分があります。これらを踏まえてお伺いしたいことをリストアップすると、
- 変数のミュータブル・イミュータブルを採用した言語で(イメージとしての)上記のようなスケッチを実行させると、どのような結果が出るのでしょうか?
- 変数のミュータブル・イミュータブルを採用したコンパイル言語で、上記のスケッチをコンパイルして、それが通った場合どのような不具合が出るのでしょうか(言語名も挙げてもらえると嬉しいです。)?