Luaの変数の一つのテーブルについて見ていきます。
Luaには配列がなく、他言語でいうところの連想配列のようなデータ構造のみが用意されており、これをテーブル(table)と呼びます。
テーブルの使い方は
table = {} table.a = "hoge" table["b"] = "huga"
のようにします。
テーブルの宣言は {} を代入することで行い、値は、ドット + キー(上のコードであれば、table.a)、もしくは、[キー](上のコードであれば、table["b"])でフィールド(要素)を追加して代入します。
テーブルの宣言と同時に各フィールドに値を代入する場合は
table = {a = "hoge", b = "hhga"}
のように行います。
テーブル内の各要素の値は
print(table.a) print(table["b"])
のようにドット + キーか、[キー]の指定で扱います。
Luaには配列のデータ構造はありませんが、テーブルを配列のように扱うことができます。
table = {} table[0] = "hoge" table[1] = "huga" print(table[0])
のように[]内にインデックスを指定する形で値を代入します。
配列のように扱う時は、
table = {} table.0 = "hoge" print(table.0)
のようにドット + インデックスの形式で扱うことはできません。
table = {"hoge", "huga"} print(table[1])
のように変数の宣言と同時に値を入れることもできますが、普段他言語を書いている方に対する注意点があります。
table = {"hoge", "huga"} print(table[0])
のようにテーブルの最初の要素の値を参照する時に 0 番目の値を取得したくなりますが、上記のコードを実行すると、
nil
が返ってきます。
Luaの場合、テーブルの初期化時に配列形式で値を指定すると、
table[1]
が最初の要素になります。
table = {"hoge", "huga"} print(table)
でテーブルの中の値を確認してみると、
table: 0x55bdc01f90
のような出力になり、テーブルの中は確認できません。
Luaでは他言語のダンプのような機能は用意されていないので、
function print_r(t, indent) indent = indent or "" for k, v in pairs(t) do if type(v) == "table" then print(indent .. k .. " {") print_r(v, indent .. " ") print(indent .. "}") else print(indent .. k .. ": " .. tostring(v)) end end end
のような関数を設けて、
print_r(table)
のように使用します。
※ Luaの関数の詳細に関しては今回は触れません
例として、
function print_r(t, indent) indent = indent or "" for k, v in pairs(t) do if type(v) == "table" then print(indent .. k .. " {") print_r(v, indent .. " ") print(indent .. "}") else print(indent .. k .. ": " .. tostring(v)) end end end table = {a = "hoge", b = "huga", c = {"piyo", "taro"}} print_r(table)
というコードを作成した後にコードを実行してみます。
a: hoge b: huga c { 1: piyo 2: taro }
※ 値の並び順が異なることがあります。