コントロール構造

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

コントロール構造 は、Luau コードの実行フローを管理する声明です。コントロール構造には、4種類の主なタイプがあります:

if 文、while ループ、および repeat ループの条件は、Luau の表現または値であることができます。値が false または nil でない場合、Luauは条件付き文でそれを true として評価します。他のスクリプト言語とは異なり、Luau はゼロと空の文字列の両方を true と考えます。

文がある場合

基本の if 文は、条件をテストします。条件が真である場合、Luau は thenend の間のコードを実行します。

elseif 文を使用して、if 条件が偽である場合、追加の条件をテストできます。すべての else および if および elseif 条件が失敗した場合にコードを実行するための 文を使用できます。elseifelse のパーツは両方オプションですが、最初の if 文言なしでは使用できません。

ifelseifelse の連鎖で、Luau は上から下への順序で条件をテストし、最初の true 条件に停止し、その後に続くコードを実行します。


if 2 + 2 == 5 then
print("Two plus two is five") -- 条件が偽であるため印刷しない
elseif 2 + 3 == 5 then
print("Two plus three is five") -- 2 plus 3 は 5
else
print("All conditions failed") -- 前の条件が真であるため印刷しない
end

ループ中 while

A whiledo ループは、指定された条件が真か否かを評価します。条件が false または nil である場合、ループが終了し、Luau はループ内のコードをスキップします。条件が true である場合、Luau はループでコードを実行し、プロセスを繰り返します。


local timeRemaining = 10
while timeRemaining > 0 do
print("Seconds remaining: " .. timeRemaining)
task.wait(1)
timeRemaining -= 1
end
print("Timer reached zero!")
--[[ 結果の出力:
Seconds remaining: 10
Seconds remaining: 9
Seconds remaining: 8
Seconds remaining: 7
Seconds remaining: 6
Seconds remaining: 5
Seconds remaining: 4
Seconds remaining: 3
Seconds remaining: 2
Seconds remaining: 1
Timer reached zero!
]]

無限ループ

whiledo ループを使用して、条件として true を設定して無限のゲームループを記述できます。


while true do
print("Looping...")
task.wait(0.5)
end
--[[ 結果の出力:
Looping...
Looping...
Looping...
Looping...
...
]]

繰り返しループ

The repeatuntil ループは、条件が真になるまで繰り返します。条件付きテストは、コードブロックが実行された後の に評価されるため、コードブロックは常に少なくとも 1回運行します。他の言語とは異なり、ローカル変数を repeat ループ内で宣言した until 内の Luau スコープには条件が含まれています。


local currentGoblinCount = 18
-- ゲームで最大 25 のゴブリンをスポーンする
repeat
spawnGoblin()
currentGoblinCount += 1
print("Current goblin count: " .. currentGoblinCount)
until currentGoblinCount == 25
print("Goblins repopulated!")
--[[ 結果の出力:
Current goblin count: 19
Current goblin count: 20
Current goblin count: 21
Current goblin count: 22
Current goblin count: 23
Current goblin count: 24
Current goblin count: 25
Goblins repopulated!
]]

ループについて

ループ A は、数字カウンター またはコレクションの アイテム数 に基づいて、コードを設定数回実行します。

ループ用の数字

A fordo ループはカウンターを使用してループを実行する回数を決定します。ループは、開始値、終了値、オプションの増加値で宣言されます。

Luau はカウンターを開始値と同等に設定し、for ループでコードブロックを実行し、カウンターに増加を追加します。増分が正の場合、プロセスはカウンターが終値と同じまたはそれ以上になるまで繰り返されます。増分が負である場合、プロセスはカウンターが終値と同じかそれ以下になるまで繰り返されます。

オプションの増分は、1 にデフォルトします。全数字である必要はありません。


for counter = 1, 3 do
print(counter)
end
--[[ 結果の出力:
1
2
3
]]
for counter = 1, 6, 2 do
print(counter)
end
--[[ 結果の出力:
1
3
5
]]
for counter = 2, 0, -0.5 do
print(counter)
end
--[[ 結果の出力:
2
1.5
1
0.5
0
]]

ループの一般化

一般的な for ループは、数列ではなくコレクション内のアイテムを反復します。一般的な for ループでは、コレクション内の各アイテムのコードを実行し、コード内の各アイテムを簡単に使用できます。

ループには、異なる種類のコレクションを順回するための関数またはイテレータが必要です。グローバル ipairs() は配列用のイテレーターを返し、グローバル pairs() は辞書用のイテレーターを返します。string ライブラリは、string.gmatch() を提供して、文字列を反復します。

一般化された反復

Luau では、in キーワードを使用して、直接テーブル上でループを実行できます。たとえば、ipairs() のような再帰関数を使用するのではなく:


for i, v in {1, 2, 3, 4, 5} do
print(i, v)
end

一般化された反復も、__iter メタメソッドを使用してカスタムイテレーター関数を作成できます。この工夫された例は、最後の要素から最初の要素まで、逆順でアレイを反復します:


local myTable = {1, 2, 3, 4, 5}
myMetatable = {
__iter = function(t)
local i = #t + 1
return function()
i -= 1
if i > 0 then
return i, t[i]
end
end
end,
}
setmetatable(myTable, myMetatable)
for i, v in myTable do
print(i, v)
end
--[[ 結果の出力:
5 5
4 4
3 3
2 2
1 1
]]

配列

ipairs() 関数は、テーブルの数値インデックスを順回しするIterator を返し、それぞれの要素について indexvalue を返します。これにより、すべてのインデックスが数字の配列に適しています。


local array = {"a", "b", "c", "d", "e"}
for index, value in ipairs(array) do
print(index, value)
end
--[[ 結果の出力:
1 a
2 b
3 c
4 d
5 e
]]

辞書

pairs() 関数は、テーブルのすべてのインデックス (数値インデックスを含む) を順回しするIteratorを返し、辞書の各エントリに対して keyvalue を返します。辞書テーブル内の要素の順序は任意です。これにより、非数字のインデックスでアイテムが保存されている辞書でのループが適切になります。


local dictionary = {
[1] = "a",
["Hello"] = "b",
[5] = "c",
[true] = "d",
["World"] = "f",
[false] = "e"
}
for key, value in pairs(dictionary) do
print(key, value)
end
--[[ 結果の出力:
Hello b
true d
false e
World f
5 c
1 a
]]

ループを破る

ループを強制終了するには、break キーワードを使用します。次のコードサンプルは、無限ループ whiledo を破る方法を示しています。


local secondsElapsed = 0
local timeout = 5
while true do
task.wait(1)
secondsElapsed += 1
print("Seconds elapsed:", secondsElapsed)
if secondsElapsed == timeout then
break
end
end
print("Five seconds elapsed. Time to move on!")
--[[ 結果の出力:
1
2
3
4
5
Five seconds elapsed. Time to move on!
]]

ループを続ける

ループを反復させて再起動させるには、continue キーワードを使用します。A for ループはカウンターを反復します; while および repeatuntil は続行する前にループ条件をチェックします。次のコードサンプルは、特定の のすべての子を取得します。


local function GetChildrenOfClass(parent: Instance, className: string): {Instance}
local children = {}
for _, child in parent:GetChildren() do
if child.ClassName ~= className then continue end -- ループを反復する
table.insert(children, child)
end
return children
end