この文書の目的
Lua で遊んでいると、プログラムにて変数を**「作る」**必要性に出くわす場合があります。この文書では、Lua のプログラムを用いて、グローバル変数を作る(宣言する、もしくは、定義する)方法を説明します。
英文を読むことに抵抗のない人は、Stackoverflow の記事 How do I make a dynamic variable name in Lua? を見ると良いかもしれません(というか、そこに全て書いてあります)。以前、私が調べていたときには、日本語で書かれた情報を見つけることができなかったので、ここにまとめた次第です。
動作確認した Lua のバージョン
Lua-5.3.4。_G (=大域環境を保持するグローバル変数)が備わっているバージョンであれば、多分、使えると思います。
しくみ
グローバル変数は _G に格納されているフィールドです。そのため、_G["PI"]=3.141592 を実行すれば、3.141592 という値を持つグローバル変数 PI が定義されます(実際には、_G["PI"]=4*math.atan(1) としたほうが良いかもしれない)。
Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio
> PI
nil
> _G["PI"]=3.141592
> PI
3.141592
>
コードの例
Office VBA におけるキーコード定数の一部 vbKeyA から vbKeyZ までを、プログラムにより定義してみます。これらの値は、vbKeyA には文字 A の ASCII コードである 65 が、vbKeyB には文字 B の ASCII コード 66 が格納されているといった具合です(参考:MSDN Keycode 定数)。
do
local kCodeA=string.byte("A")
local kCodeZ=string.byte("Z")
for i=kCodeA,kCodeZ do
_G["vbKey"..string.char(i)]=i
end
end
このスクリプトを実行し、それぞれの仮想キーコードが格納されている変数の値を確認すると…
> vbKeyA
65
> vbKeyB
66
> vbKeyZ
90
それぞれの変数が定義されていることを確認できます。
まとめ
本文書では、グローバル変数がテーブル _G のフィールドであることを紹介し、その応用としてプログラムにて動的に変数を定義する方法を示しました。この仕組みを応用すると、様々なことができますが、それらについてはまた別の記事で説明したいと思います。