3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rubyist が AviUtl のスクリプトを書くための Lua の注意点

Last updated at Posted at 2019-08-25

AviUtl のスクリプトを書き始めた 私が気づいたところのメモ.
AviUtl では Lua 5.1 という,古いバージョンを使うことになる.

違うところ

デフォルトがグローバル変数

Ruby と違い,Perl のように,デフォルトがグローバル変数なので,localをつけてローカル変数にするようにする.Ruby と同様,shadowing が許容されているほか,再宣言も可能なので,コーディングでは注意.

ifブロックがスコープを作る

Ruby と違い,ifthen節はローカル変数のスコープを作り,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 オリジンが基本らしい.

+=とかはない

なれてないとエラーメッセージがわかりにくいので注意.

論理演算子はandornot

Ruby にもandornotはあるが,他の言語と同様に 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)とは挙動が異なる.

nilfalseだけ偽でほかは真

これは Ruby と同じ.AviUtl の拡張編集スクリプトの場合,obj.check0true/falseだけど--dialog/chk0/1なので注意 (0は真).

演算子がメタメソッド

Ruby の演算子がメソッドであるのと似ている.

doendなどの予約語

ブロックがdo-endなのは親近感.ただし勝手に作るブロックもdo-end (Ruby ではbegin-end).

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?