RPGツクール向け素材>メモ書き>VX系

13) スクリプトの作り方 再定義とalias編


告白しよう.
スクリプト素材屋を永らくしてても,aliasの使い方が解りませんでした.

ehimeはC言語は学んだけど,Ruby初心者です.
2009年春,せめてaliasの使い方ぐらいは勉強しようと思い,このページを作りました.

そんなehimeが送る「再定義とalias」の解説.


(1) 再定義
 元々ある定義(def: define)をもう一度定義し直すことを「再定義」と言います.
↓例

↓結果

定義し直したので,元々の定義は無かったことになります.

 基本的にスクリプト素材は,元々あるdefを再定義することで欲しい処理を実現しています.
スクリプト素材を多用するほど,再定義されるdefはそれだけ多くなるため,再定義されたdefが重なる確率(defの競合問題発生確率)が高くなります.


(2) alias (エイリアス)
 スクリプトの競合問題を緩和すると言われているのが,このalias.
aliasは,元々あるdefに別名を付けるという働きがあるらしいんだが,今ひとつ解らん.
百聞は一見に如かず.aliasの働きを見るため,とりあえず組んでみた.
↓例

↓結果

本来は,draw_text_000 = "RPGツクールVX"だったのに,
draw_text_000 = "素材屋"
draw_text_001 = "RPGツクールVX"
になった.

そうか!
 alias draw_text_001 draw_text_000 #alias 別名 元の名前
は,draw_text_000 に draw_text_001 という別名を付ける働きだけど,イメージ的には,
「draw_text_001 = draw_text_000」と draw_text_001 に draw_text_000 を代入するでいいんだな.

代入後,draw_text_000 = "素材屋" を再定義しても,
draw_text_001 には "RPGツクールVX" が残っているために,上記の結果になるのか.



…ん? alias を使用してスクリプトを組む場合でも,結局は再定義することになるんだね.
ただの再定義と違う点は,alias を使用すれば,別名になって元の定義内容が残るということか.


(3) まとめ
同じ出力をするのに,「ただの再定義」と「alias を使った再定義」で記述してみた.


↓例0:元々の記述とその出力



↓例1:再定義で文追加した時の記述とその出力




↓例2:alias を使った再定義で文追加した時の記述とその出力

処理文を追加するだけなら,「ただの再定義」より「alias を使った再定義」の方が
元の def の内容を使用できる分,記述が楽でした.

おそらく,aliasを使った再定義は「元の def の内容を使用して,処理文を単純に追加する」だけの再定義のみにおいて有効だと思います.
元のdefの前後に,ただ処理を追加していくだけなら,競合問題は生じないと思います.

aliasを使っても,alias後の再定義に元のdefを使用しなかったりした場合は,aliasを使った意味はないと思います.ただの再定義と変わらないわけですし.
また,元のdefの中身を一部消去・変更したりしなくてはいけない再定義だと,aliasは使えなさそうです.


↓↓ehimeの感想
結局のところ,alias も def を再定義するため,
「alias を使用しても,競合問題を全回避することはできない」
ですね.
ただ「追加する」部分においては,aliasは有効であると確認できたので,これからは「追加する」だけの再定義にはaliasを積極的に使用しようと思います.


(4) おまけ
イメージ的に解りやすいように,数式で表してみた.
(あくまでehimeの中でのイメージです)

defをy,aliasで付けるyの新しい名前をxと置くと…
def原型再定義aliasを使用した再定義
aliasが
有効な
再定義
y = 2 + 3


出力 (y = 5)
y = 2 + 3

y = 1 + 2 + 3 + 4 #再定義
出力 (y = 10)
y = 2 + 3
x = y #alias
y = 1 + x + 4 #再定義
出力 (y = 10)
aliasの
意味が無い
再定義
y = 2 + 3


出力 (y = 5)
y = 2 + 3

y = 1 + 2 + 8 + 4 #再定義
出力 (y = 15)
y = 2 + 3
x = y #alias
y = 1 + 2 + 8 + 4 #再定義
出力 (y = 15)
「aliasが有効な再定義」の仕方だと,上手に古い定義(def)も使用しているので,競合問題が生じにくい.
一方「aliasの意味が無い再定義」の仕方だと,普通の再定義と変わらないよね.

←戻る