この文書の目的
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
>
コードの例
キーコード定数の一部 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 のフィールドであることを紹介し、 その応用として、プログラムにて動的に変数を定義する方法を示しました。 この仕組みを応用すると様々なことができますが、 それらについてはまた別の記事で説明したいと思います。