テーブルデータ型は、nil以外の任意の型の複数の値を格納でき、ブール値、数字、文字列、関数、および他のテーブルを含みます。テーブルは波括弧({})を使用して作成します:
-- 変数 "t" に割り当てられた空のテーブルを構築local t = {}print(t) -- {}
テーブルは配列や辞書として使用できます。配列は数値の順序リストをインデックスとして使用しますが、辞書は数値、文字列、およびオブジェクトをインデックスとして持つことができます。
テーブルを操作するための組み込み関数の詳細については、tableライブラリを参照してください。
配列
配列は値の順序リストです。配列は、特別な権限を持つプレイヤーのグループなど、データのコレクションを保存するのに便利です。
配列の作成
Luauテーブルを使用して配列を作成するには、値を順番に宣言し、カンマで区切ります。
-- 三項目からなる配列を構築local testArray = {"A string", 3.14159, true}print(testArray)
配列からの読み取り
配列から読み取るには、参照の後に一対の角括弧を追加し、その中に要素のインデックス番号を指定します([pos]):
-- 三項目からなる配列を構築local testArray = {"A string", 3.14159, true}print(testArray[1]) -- A stringprint(testArray[2]) -- 3.14159print(testArray[3]) -- true
配列への書き込み
インデックスでの配列の値を定義または書き換えるには、角括弧([index])にインデックス番号を指定し、その後に=と値を追加します。
local testArray = {"A string", 3.14159, true}testArray[2] = 12345testArray[4] = "New string"print(testArray[2]) -- 12345print(testArray[4]) -- New string
配列の反復処理
配列を反復処理するには、forループを使用できます。配列には数値のインデックスがあるため、数値のforループを1から配列の長さ(#array)まで使用することもできます。
local testArray = {"A string", 3.14159, true, "New string"}-- 一般的な反復を使用してループ処理for index, value in testArray doprint(index, value)end-- 配列の長さ演算子(`#`)を使用して反復処理for index = 1, #testArray doprint(index, testArray[index])end
アイテムの挿入
配列の末尾にアイテムを挿入するための組み込みの方法が2つあります:
- 配列への参照とアイテムの値を渡すtable.insert()関数を使用します。
- array[#array+1]構文を使用して新しいアイテムを配列に追加します。
local testArray = {"A string", 3.14159}table.insert(testArray, "New string")testArray[#testArray+1] = "Another new string"print(testArray[3]) -- New stringprint(testArray[4]) -- Another new string
配列の開始と終了の間にアイテムを挿入するには、table.insert()の2番目の引数として位置の値を含めます。これにより、新しいアイテムが挿入され、以降のアイテムは1つ上のインデックスに押し上げられます。
local testArray = {"First item", "Next item"}table.insert(testArray, 2, "NEW ITEM #2")print(testArray[1]) -- First itemprint(testArray[2]) -- NEW ITEM #2print(testArray[3]) -- Next item
アイテムの削除
配列からアイテムを削除するには、table.remove()を使用します。これは、指定された位置のアイテムを削除し、以降のアイテムを1つ後ろのインデックスに移動させます。
local testArray = {"First item", "Next item", "Last item"}table.remove(testArray, 2)print(testArray[1]) -- First itemprint(testArray[2]) -- Last item
辞書
辞書は配列の拡張です。辞書は、キーと値のペアのセットを保存し、キーは任意の数値、文字列、またはオブジェクトであることができます。
辞書の作成
辞書テーブルを作成するには、それぞれのキーを=の後に定義し、値を指定します。各キーと値のペアをカンマで区切ります:
local testDictionary = {fruitName = "Lemon",fruitColor = "Yellow",sour = true}
辞書のキーは数値、文字列、およびオブジェクトであることができます。たとえば、キーはInstanceでもかまいません。オブジェクトをキーとして使用するには、角括弧([key])を使用してキーを宣言します:
local part = Instance.new("Part")local testDictionary = {partType = "Block",[part] = true}
辞書からの読み取り
辞書から読み取るには、参照の後に一対の括弧を追加し、キー名を指定します。直接文字列キーを参照するには、["key"]または.keyを使用するか、変数の値を使用します([key])。
local part = Instance.new("Part")local testDictionary = {partType = "Block",[part] = true}-- 文字列キーには引用符を含めますprint(testDictionary["partType"]) -- Block-- または、スペースのない文字列キーをインデックスするために`.`を使用しますprint(testDictionary.partType) -- Block-- 非文字列キーには引用符を省略しますprint(testDictionary[part]) -- true
辞書への書き込み
新しい辞書キーまたは既存の辞書キーの値を定義または書き換えるには、ブラケット([key])でキー名を宣言するか、キーが文字列の場合は(.key)の後に=と値を追加します。
local testDictionary = {fruitName = "Lemon",sour = true}-- 既存のキーの値を変更testDictionary["fruitName"] = "Cherry"testDictionary.sour = false-- 新しいキーと値のペアを挿入testDictionary.fruitCount = 10print(testDictionary.fruitName) -- Cherryprint(testDictionary.sour) -- falseprint(testDictionary.fruitCount) -- 10
辞書の反復処理
辞書を反復処理するには、forループを使用します:
local testDictionary = {fruitName = "Lemon",fruitColor = "Yellow",sour = true}for key, value in testDictionary doprint(key, value)end--[[ 結果出力:fruitName Lemonsour truefruitColor Yellow]]
キーと値のペアの削除
辞書からキーと値のペアを削除または消去するには、そのキーの値をnilに設定します。
local testDictionary = {fruitName = "Lemon",fruitColor = "Yellow",sour = true}testDictionary.sour = nilfor key, value in testDictionary doprint(key, value)end--[[ 結果出力:fruitName LemonfruitColor Yellow]]
参照としてのテーブル
新しい変数にテーブルを保存すると、Luauはそのテーブルのコピーを作成しません。代わりに、変数は元のテーブルへの参照またはポインタになります。テーブルへのすべての参照は、元のテーブルへの変更を反映します:
local originalArray = {10, 20}local arrayReference = originalArrayprint("Original:", originalArray[1], originalArray[2])print("Reference:", arrayReference[1], arrayReference[2])-- 元の配列の値を変更originalArray[1] = 1000originalArray[2] = 2000print("Reference:", arrayReference[1], arrayReference[2])--[[ 結果出力:Original: 10 20Reference: 10 20Reference: 1000 2000]]
テーブルのクローン
シャロークローン
ネストされたテーブルを含まずにテーブルをコピーするには、Luauはtable.clone()メソッドを提供しています。
local original = {key = "value",engine = "Roblox",playerID = 505306092}local clone = table.clone(original)
ディープクローン
ネストされたテーブルを含むより複雑なテーブルをコピーするには、次のような再帰関数を使用する必要があります:
-- テーブルをディープクローンするために使用される関数
local function deepClone(original)
-- コピーのための新しいテーブルを定義
local clone = table.clone(original)
-- オリジナルのテーブルをループ処理し、テーブル値をチェック
-- 値としてテーブルが見つかった場合、そのキー(インデックス)にディープクローンします
for key, value in original do
if type(value) == "table" then
clone[key] = deepClone(value)
end
end
-- ディープクローンされたテーブルの最終的なコピーを返します
return clone
end
関数が整ったら、次のようにディープコピーを作成できます:
local original = {key = "value",playerInfo = {playerID = 505306092,playerName = "PlayerName"},otherInfo = {{{1, 3, 5, 7, 9}}}}local clone = deepClone(original)
テーブルを凍結
テーブルを凍結すると、読み取り専用になり、変更したくない定数値を作成するのに役立ちます。凍結は永久的であり、「アンフリーズ」または「解凍」メソッドはありません。テーブルが凍結されているかどうかを確認するには、table.isfrozen()を使用します。
シャローフリーズ
ネストされたテーブルを含まずにテーブルを凍結するには、Luauはtable.freeze()メソッドを提供しています。
local target = {key = "value",engine = "Roblox",playerID = 505306092}table.freeze(target)target.playerID = 1 --> 読み取り専用テーブルを変更しようとしています
ディープフリーズ
ネストされたテーブルを含むより複雑なテーブルを凍結するには、次のような再帰関数を使用します:
local function deepFreeze(target)
-- テーブルをシャローフリーズします
table.freeze(target)
-- テーブルの各キーをチェックし、それがテーブルの場合はフリーズします
for _, value in target do
-- 値が凍結されていないことを確認します。すでに凍結されている場合、エラーが発生します
if type(value) == "table" and table.isfrozen(value) == false then
deepFreeze(value)
end
end
end
関数が整ったら、次のようにテーブルをディープフリーズできます:
local target = {key = "value",playerInfo = {playerID = 505306092,playerName = "PlayerName"},otherInfo = {{{1, 3, 5, 7, 9}}}}deepFreeze(target)target.playerInfo.playerID = 1 --> 読み取り専用テーブルを変更しようとしています