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
}
※ 値の並び順が異なることがあります。