Lua入門
ピコピコゲームエンジンではLua 5.2を使用しています。このページはLua言語の主な仕様をまとめたものです。
Lua 5.2についての詳しい説明は次のリンクをご覧下さい。
Lua 5.2 リファレンスマニュアル(外部サイト)コメント
-- ここから行末までがコメント
--[[
複数行をコメントにするときは
こんな感じに
]]
変数
-- Luaには nil, boolean, number, string, function, userdata, thread, table の8種類の基本型があります。
-- 変数の定義時に型を指定する必要はありません。
-- 整数
a=10 -- 変数aに10を代入
-- 実数
b=10.5
-- 文字列
c="Hello"
d='Hello'
-- 複数行にわたる文字列
e=[[abcd
efg
hij]]
print(e)
-- ブーリアン
f=true
g=false
四則演算
-- 算術演算子
a=1+2 -- 加算
b=4-3 -- 減算
c=4*6 -- 乗算
d=8/2 -- 除算
e=5%3 -- 剰余
f=4^2 -- 累乗
標準出力
-- 標準出力には print を使います
-- DotEDITOR では console.log に出力されます
print("test")
-- 文字列のみの場合は () が省略できます
print "test"
ブロック
-- Lua では do〜end でブロックを作ります
-- aはグローバル変数
a="global a"
do
-- bはグローバル変数
b="global b"
-- localをつけるとローカル変数になります
-- このaはローカル変数
local a="local a"
print("do のスコープ内")
print("a="..a) --a="local a"
print("b="..b) --b="global b"
end
print("do のスコープ外")
print("a="..a) --a="global a"
print("b="..b) --b="global b"
関数
-- functionで関数を定義します
function calc(a,b)
-- return で戻り値を返します
-- 「,」で区切る事で複数の戻り値を返せます
return a+b,a*b
end
a,b=calc(10,4) -- calc関数を呼び出し
print(a..","..b)
無名関数
-- 関数も変数に代入できます
calc=function(a,b)
return a+b,a*b
end
a,b=calc(10,4) -- calc関数を呼び出し
print(a..","..b)
条件分岐
-- 条件分岐は次の様になります
-- Lua に switch文はありません
a=4
if a==1 then
print("a==1")
elseif a==2 then
print("a==2")
elseif a==3 then
print("a==3")
else
print("other")
end
その他の演算子
-- 比較演算子
g=(a==b) -- 等しい
h=(a>b) -- 大きい
i=(a<b) -- 小さい
j=(a>=b) -- 大きいか等しい
k=(a<=b) -- 小さいか等しい
l=(a~=b) -- 等しくない
-- 論理演算子
m=(g and h) -- かつ
n=(i or j) -- または
o=(not k) -- でない
-- 文字列の連結
p="Hello ".."World"
-- 単項演算子(「++」や「--」)や3項演算子は Lua にはありません。
繰り返し
-- for 文
for i=1,10,2 do
print(i) -- 1から10まで2個飛びで
end
-- while 文
i=1
while i<10 do
print(i)
i=i+1
end
-- repeat 文
i=1
repeat
print(i)
i=i+1
until i==10
-- break 文
for i=1,10 do
if i>5 then
break -- ここでループを抜けます
end
print(i)
end
-- Lua に continue 文はありません
可変引数
-- 引数を「...」にすると可変引数になります
function sum(...)
-- 可変引数をテーブルにする
local t={...}
local s=0
for i=1,#t do
s=s+t[i]
end
return s
end
print(sum(1,2,3,4,5,6,7,8,9))
コルーチン
-- Lua にはコルーチンがあります
-- コルーチンを使うと見通しのよいプログラムを作る事ができます
func=function()
print("a")
coroutine.yield() -- 一旦抜ける
print("b")
coroutine.yield() -- 一旦抜ける
print("c")
end
-- funcをコルーチン化する
c=coroutine.wrap(func)
-- cを呼び出すとfuncをコルーチンとして呼び出せる
c() -- "a" を表示
c() -- "b" を表示
c() -- "c" を表示
c() -- エラー
-- coroutine は長い単語なので
-- 次のようにショートカットを使うとキー入力が楽です。
co=coroutine
func2=function(v)
print("a:"..v)
co.yield() -- 一旦抜ける
print("b:"..v)
co.yield() -- 一旦抜ける
print("c:"..v)
end
d=co.wrap(func2)
d(1) -- 引数を渡す事もできます
d(2) -- この引数は無効
d(3) -- この引数は無効
テーブルの作成
-- Luaには構造体やクラスはありません
-- すべてテーブルを使って表現します
-- テーブルの実体は連想配列です
t={} -- テーブルを変数tに代入
u={ -- 要素付きで作成
a=1,
b="abc",
c=function(s)
return s.a+2
end
}
-- 要素への参照は次のように「.」を使います
print("u.b="..u.b)
-- ↑
テーブルの変更
t={} -- テーブルを作成
-- テーブルに要素を追加するには
-- 次のようにします
t.a=1
t.b="abc"
-- 次のようにする事もできます
t["a"]=1
t["b"]="abc"
配列
-- Luaでは配列もテーブルで表現します
t={}
t[1]=10 -- 添字は1からです
t[2]=20
t[3]=30
-- #をつけると要素の数を返します
print(#t) -- 3を出力
t[#t+1]=40 -- 要素の追加
-- 次のように定義する事もできます
u={10,20,30}
イテレート
-- 連想配列のイテレート
t={
a=10,
b=20,
c=30
}
-- 連想配列の場合は pairs を使います
for i,v in pairs(t) do
print("t."..i.."="..v)
end
-- 配列のイテレート
u={10,20,30}
-- 配列の場合は ipairs を使います
for i,v in ipairs(u) do
print("u["..i.."]="..v)
end
インスタンスメソッド
-- テーブルに「:」を使うとインスタンスメソッドのように関数を呼び出す事ができます。
t={
a=3,
b=5,
add=function(s)
return s.a+s.b -- 3と5を加算 end
}
print(t:add()) -- (1)
print(t.add(t)) -- (2)
-- (1)は(2)と同様の意味です
-- 「:」を使うと第一引数を省略できます
文字列操作
-- 文字列を操作するにはstringオブジェクトを使用します。
-- 文字を文字コードに変換します
t,u=string.byte("ABC",2,3)
print(t..","..u) --66,67
-- 文字コードから文字列を作ります
t=string.char(t,u)
print(t) --BC
-- フォーマット文字で整形した文字列を作ります
a=12
t=string.format("a=%04d",a)
print(t) --a=0012
-- 文字列の検索
-- 見つかった位置と終了位置を返します
-- 見つからないときはnilになります
t,u=string.find("abcdef","cde")
print(t..","..u) --3,5
-- 文字列の長さを返します
t=string.len("abcde")
print(t) --5
-- 大文字にします
t=string.upper("abc")
print(t) --ABC
-- 小文字にします
t=string.lower("ABC")
print(t) --abc
-- 繰り返し文字列を作ります
t=string.rep("Ab",3)
print(t) --AbAbAb
-- 文字列を逆さまにします
t=string.reverse("ABC")
print(t) --CBA
-- 文字列を指定位置から終端まで切り出します
t=string.sub("ABCDEF",3)
print(t) --CDEF
-- 文字列を指定位置範囲で切り出します
t=string.sub("ABCDEF",3,5)
print(t) --CDE