Luaの変数のテーブルについて

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
}

※ 値の並び順が異なることがあります。

マインクラフト用ビジュアルエディタを開発しています。
詳しくはinunosinsi/mcws_blockly - githubをご覧ください。