Lua で、プログラムから変数を作る方法

この文書の目的

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