lua 学習メモ
基本
コメント
code:lua
-- コメント
-- [[
複数行の
コメント
]]
変数
代入
local a = 1
localは関数内(関数外である場合は単一ソースファイル内)でローカルである宣言。localがないとグローバルとして扱われる。
宣言しなくても変数は使える。宣言(初期化)しない場合の初期値はnil
型
code:lua
local d = nil -- 無効を示す nil
local n = 1
local str = "abc"
local bool = true
local tbl = { 1, 2, 3 } -- 配列や構造体というものはない。どちらも「テーブル」が兼ねる
local tbl2 = {
arr = { "a", "b" , "c" }, -- a:1 形式ではなく a=1 形式
name = "Taro"
}
テーブルは参照渡しである。'b=a'したのちaを変更するとbまで変わってしまう。複製する方法は後述。
分岐
code:lua
if a == 1 and b == 2 then -- and/or
...
elseif *** then -- elifでも else if でもないので注意
...
else
...
end
条件式
code:lua
a == b
a >= b
a ~= b -- a != b は無いので注意
not a -- !a は無いので注意
ループ
code:lua
-- 注意:luaは1オリジンである。
for i=1, 10, 1 do --初期値, 終了値, 増分値(省略可)
-- i= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
-- 注意:終了値を含む。
end
arr = { 1, 2, 3 }
for i = 1, #arr do
-- #<テーブル名>はテーブルの要素数が返る
end
for idx, value in pairs(arr) do
-- idxは1オリジン
-- for value in arr ...のような書き方はできない
-- idxが不要なら _ を代わりに置くことができる
end
local cnt = 1
while cnt <= 5 do
...
cnt = cnt + 1
end
関数
code:lua
function func(param)
...
return param
end
--複数値をまとめて受け取ることもできる
function soomefunc()
return "a", "b", "c"
end
local r1, r2, r3 = somefunc()
出力
code:lua
print("Hello")
print(result)
printではテーブルの中身を展開しないので、出力したいなら以下のような関数を用意する
code:lua
function formatObject(obj)
if type(obj) == "table" then
local str = "{"
for key, value in pairs(obj) do
str = str .. key .. ":" .. formatObject(value) .. ", "
end
str = string.sub(str, 0, -3) .. "}"
return str
elseif type(obj) == "string" or type(obj) == "number" or type(obj) == "boolean" then
return tostring(obj)
else
return type(obj)
end
end
...
print(formatObject(enemies))
よくつかうやつ
math.random( <最小値>, <最大値>)  -- 最小値から最大値を含むランダムな小数が返る。値を指定しなければ 0~1の小数。片方のみ指定すると1からその値までの乱数。random(0)はその環境が取り得る最大幅の乱数(全ビット乱数)
math.floor(<値>) - 値以下(未満ではない)の整数を返す
注意点
Luaにはテーブルをコピーする方法がない
普通に代入すると参照渡しになる
オブジェクトは手作業でコピーする必要がある。以下↓のような関数を作ると便利
code:lua
-- オブジェクトfromObjを複製した新しいオブジェクトを返す
local function duplicateObject(fromObj)
if type(fromObj) ~= "table" then
return fromObj
end
newObj = {}
for key, value in pairs(fromObj) do
newObjkey = duplicateObject(value)
end
return newObj
end
Luaのpairsとipairsは、テーブル(table)をループ処理するための関数ですが、動作には以下のような違いがあります:
【1】ipairs の特徴(配列的な使い方)
• **連続した整数のキー(1, 2, 3,…)**に対して順番に走査。
• 途中でnilが出た時点で終了。
• 添字順(インデックス順)に走査。
code:lua
local t = { "a", "b", "c" }
for i, v in ipairs(t) do
print(i, v)
end
-- 出力:
-- 1 a
-- 2 b
-- 3 c
【2】pairs の特徴(連想配列的な使い方)
• **すべてのキー(整数・文字列など)**を対象に、順不同で走査。
• 途中にnilがあっても無視して続く。
• ハッシュテーブル部分も含めてすべて対象。
code:lua
local t = { "a", "b", key1 = "x", key2 = "y" }
for k, v in pairs(t) do
print(k, v)
end
-- 出力例(順不同):
-- 1 a
-- 2 b
-- key1 x
-- key2 y
【使い分け】
• 順番通りに配列を処理したい → ipairs
• テーブルの全ての要素(連想含む)を処理したい → pairs