本文へスキップ

シャドーイングとは?

しゃどーいんぐ

プログラミングで、内側のスコープで同名の変数を宣言することにより、外側の同名変数が隠れてしまう現象です。

シャドーイング(Shadowing)とは、プログラミングにおいて、内側のスコープブロック関数の内部)で外側と同じ名前の変数を新たに宣言したとき、内側からは外側の変数にアクセスできなくなる現象です。まるで外側の変数が「影に隠れた(shadowed)」ように見えなくなることからこの名称が付いています。

多くのプログラミング言語がシャドーイングを許可しています。たとえばRustでは変数の再バインディングとしてシャドーイングを意図的に活用でき、同じ変数名に異なる型の値を順番に結びつけることが可能です。一方、JavaScriptではブロックスコープの変数(let/const)が同じスコープ内では再宣言できませんが、ネストしたスコープではシャドーイングが発生します。

シャドーイングが問題になる典型例は次のとおりです。

  • ループ変数と外側の同名変数が衝突し、意図しない値を参照してしまう
  • 関数の引数名とグローバル変数名が一致し、グローバル変数の更新が行われない
  • コードを読む人が「どちらの変数を指しているか」を把握しにくくなる

意図的なシャドーイングは可読性を高める場合もありますが、意図せず発生したシャドーイングはバグの温床になります。多くのリンターやコンパイラは警告を出す設定を持っているため、チームの規約に従って活用・抑制を使い分けることが重要です。

使い方・例文

Rustで文字列を受け取って整数に変換するとき、let x = x.parse::<i32>().unwrap(); のように同じ変数名xでシャドーイングすることで、異なる型の値を同じ名前で扱う実装がよく行われます。

この用語をシェア

𝕏 でポスト LINE

最終更新:

関連用語