MTにおける変数の有効範囲や、それに関わる問題点
Movable Typeで使用される変数は、全てグローバル変数です。
本来、プログラムで変数を用いる場合には、有効範囲(スコープ)があります。どういうことかというと、有効範囲が広い変数は全ての範囲にて有効(グローバル)である、有効範囲が狭い変数は限られた範囲で使用後に破棄されてしまう(ローカル)、ということです。
変数が全てグローバルであるということは、どこかのモジュールで使用した変数を再利用する場合、初期化しておかないと既に値が入っていて変な挙動を示すことは十分に考えられます。
以下に一例を示します。
<p>変数初期化</p>
<MTSetVar name="hoge" value="1">
<p>1回目ループ</p>
<MTFor var="x" from="0" to="100">
<MTSetVar name="hoge" op="++">
<MTGetBar name="hoge"><br />
</MTFor>
...(なんかの処理)
<p>2回目ループ</p>
<MTFor var="x" from="0" to="100">
<MTSetVar name="hoge" op="++">
<MTGetBar name="hoge"><br />
</MTFor>
このコードには、ふたつのForループがあります。
最初のループでは、変数hogeを初期化し、ループ内で+1ずつ増やしていく処理(インクリメント)にて使用しています。
間に、「...(なんかの処理)」という処理を挟んでいるとしましょう。
2回目のループでは、変数hogeを初期化し忘れ、1回目と同じ結果を期待して、同じ処理を行っています。
このコードは、実行すると、2回目ループでのhoge変数の出力が102から開始されてしまいます。これは、hoge変数を初期化するのを怠ったためで、1回目のループ・インクリメント処理で使用したhoge変数に値が残ったままであるためです。
このひとつ目のループとふたつ目のループが、別モジュールに入っていたらとすると、意図しない不具合が発生して、しかも不具合の特定が難しくなってしまいます。
このコードを正しく動作させるためには、以下のように2回目のループの直前にhoge変数の初期化を行うコードを挿入すればOKです。
<p>変数初期化</p>
<MTSetVar name="hoge" value="1">
<p>1回目ループ</p>
<MTFor var="x" from="0" to="100">
<MTSetVar name="hoge" op="++">
<MTGetBar name="hoge"><br />
</MTFor>
...(なんかの処理)
<p>2回目ループ</p>
<MTSetVar name="hoge" value="1">
<MTFor var="x" from="0" to="100">
<MTSetVar name="hoge" op="++">
<MTGetBar name="hoge"><br />
</MTFor>
- ページ先頭へ
- 前のエントリ: 繰り返し処理における予約変数
- 次のエントリ: 変数への適切な代入場所
- カテゴリ:変数