AviUtl のスクリプトを書き始めた 私が気づいたところのメモ.
AviUtl では Lua 5.1 という,古いバージョンを使うことになる.
違うところ
デフォルトがグローバル変数
Ruby と違い,Perl のように,デフォルトがグローバル変数なので,local
をつけてローカル変数にするようにする.Ruby と同様,shadowing が許容されているほか,再宣言も可能なので,コーディングでは注意.
if
ブロックがスコープを作る
Ruby と違い,if
のthen
節はローカル変数のスコープを作り,then
節でlocal
をつけた変数はif
の外では読めない.条件によって別の値を代入して後で使いたい場合は,if
の外で宣言しておく必要がある.
全部テーブル
Ruby が全部メソッド,Python が全部 attribute であるように,Lua のオブジェクトは全部テーブル (Ruby のHash
) のようだ.つまり,Lua のobj.func
は,Ruby でいうところのobj[:func]
のようなものと言える.というよりobj["func"]
のシンタックスシュガーに過ぎない.()
をつけないと呼び出しではなく,関数オブジェクトを指すという点は Python に近いと言える.つまり,obj["func"](arg)
のように呼び出すことも可能.
配列は 1 オリジン
配列もテーブルだけど,キーが全部整数なら配列扱い (普通のテーブルより速い) という,よくわからない扱いらしい.その配列は (Ruby を含む多くの言語の 0 オリジンと違って) 1 オリジンが基本らしい.
+=
とかはない
なれてないとエラーメッセージがわかりにくいので注意.
論理演算子はand
,or
,not
Ruby にもand
,or
,not
はあるが,他の言語と同様に Ruby にもある&&
,||
,!
は Lua では使えない.また,not equal は!=
ではなく~=
である.
例外はない
例外はないので,pcall
というのを使うらしい.pcall
を使った処理は,Ruby の C 拡張での例外の扱いに似ている.
C/C++ との連携
Lua とのインターフェースであるスタックを直接操作することになっている点が特徴的.C/C++ から Lua の関数を呼び出したり,テーブルの値を参照するには,関数とその引数や,テーブルをスタックに乗せてから呼び出しや読み出し参照を行う必要がある.また,C/C++ で定義した Lua の関数がその引数を読むときも,スタックを介して読み取る必要がある.このあたりをラップした API が用意されている Ruby との大きな違いである.
似ているところ
多重代入,多値 return が可能
func(unpack(list))
のように展開もできる.ただし,引数の最後以外では最初の要素だけ返すため,func(unpack(a), unpack(b))
はfunc(a[1], unpack(b))
のようになり,Ruby のfunc(*a, *b)
とは挙動が異なる.
nil
とfalse
だけ偽でほかは真
これは Ruby と同じ.AviUtl の拡張編集スクリプトの場合,obj.check0
はtrue
/false
だけど--dialog
の/chk
は0
/1
なので注意 (0
は真).
演算子がメタメソッド
Ruby の演算子がメソッドであるのと似ている.
do
,end
などの予約語
ブロックがdo
-end
なのは親近感.ただし勝手に作るブロックもdo
-end
(Ruby ではbegin
-end
).