【Luaによる制御(2)】(るあによるせいぎょ に)


Luaに触ったことがない人向け、Lua講座。
Rigid Chipsのモデルデータが書ける事を前提で進めますんでよろしく。
さて、いよいよ第二回、「Luaで新しくできるようになったことをやろう!」です。

Luaで扱うnil,bool,数値,文字列のちょっとちゃんとしたお話と各種演算子について

第一回でも述べたように、Luaで扱える変数の型には8つの種類があります。
すなわち「nil型,ブーリアン,数値型,文字列型,関数型,テーブル,スレッド,ユーザーデータ」です。

そのうち前4つの型について前回のおさらいがてら、すこしちゃんとしたお話をしましょう。

  • nil型
    nil型はnil値のみ値を持ちます。
    何かしら他の値を代入される前の変数はnil値を持っています。
  • bool型
    bool型はtrueとfalse(真値と偽値)、二通りの値のどちらかを持ちます。
    条件文と論理演算の為に存在する型です。
  • 数値型
    整数、小数、負の数、あらゆる実数の値を持ちます。小数や指数を用いた表現も可能です。
    つまり 100, 100.0, 1e2, 10.0e1 は同じ値を表現します。
    この型には一通りの算術演算子を用いることが出来ます。
  • 文字列型
    文字列の並びをシングルクオート(''),ダブルクオート(""),或いは二重の角括弧([[]])で囲ったものが文字列です。
    各種エスケープシーケンスが使えたり、使えなかったりします。

そして、各種演算子があります。

  • 算術演算子
    +(加算), -(減算), *(乗算), /(除算)に ^(累乗), -(符号反転) は算術演算子です。
    数値型について用いる事が出来、たいていあなたが期待する通り動作するでしょう。
  • 関係演算子
    ==(等しい), ~=(等しくない)
    <(小なり), <=(小なりイコール), >(大なり), >=(大なりイコール)
    これらは関係演算子であり、これらの演算子はtrueもしくはfalse(つまりbool型)を返します。
    注意しなければならないのは文字列型と数値型を比較した場合、たとえ一見同じ内容であっても等しいと判断されない事です。
    つまり "0" == 0 はfalseを返します。
  • 論理演算子
    and(論理積), or(論理和), not(否定)
    これらは論理演算子です。
    論理演算子はfalseとnilのみを偽値とみなし、それ以外をみな真値とみなします。
  • 代入
    =(代入)
    一般的な代入の他に、多重代入が許されています。
    多重代入とは複数の式、配列から同時に代入を行う操作のことです。
    代入するそれぞれの要素はカンマを用いて区切って下さい。
    a,b = c,d -- aにcを、bにdを代入
    x,y = y,x -- xとyを交換
  • 連結
    ..(連結)
    右辺と左辺の文字列ないし数値を結合し、一つの文字列とします。
    数値は文字列に変換され、結合されます。
    "I am" .. " Tom."	-- 文字列 "I am Tom."が返される
    "X=" .. 12		-- 文字列 "X=12"が返される

まー、今回はこんな感じです。

一歩進んだ変数の扱い方(1) 〜テーブル〜

引き続き、変数のお話です。ここではテーブルについて扱いたいと思います。
テーブルとはいくつかのデータを名前や数字の添え字でまとめたもので、配列や構造体・オブジェクトのような使い方が出来ます。

まずは、単に数値型の配列としてテーブルを使ってみましょう。
テーブル変数の宣言と、その要素へのアクセスは以下のように行います。

hoge = {}          -- 空のテーブル型変数hogeを宣言
moge = {12,23,123} -- テーブル型変数mogeを宣言、一番目の要素が12,二番目の要素が23,三番目の要素が123
hoge[1] = 5        -- hoge[1]の要素に5を代入
hoge.1 = moge.1    -- hoge["1"]の要素にmoge["1"]の要素を代入(hoge[1]ではないことに注意)

C言語のように配列の大きさを指定する必要はありません、後から自由に要素を追加することが出来ます。
添字の指定には"[添字]"と".添字"が使えます。

では、試しにちょっと使ってみましょうか。
(1)で用いた雛形を以下のように改変してください。

Lua{
	hoge = {12,23,123} -- テーブル型変数hogeを宣言、一番目の要素が12,二番目の要素が23,三番目の要素が123
	function main()
		out(0,"hoge[0]= ",hoge[0]) -- hoge[0]の要素を表示
		out(1,"hoge[1]= ",hoge[1]) -- hoge[1]の要素を表示
		out(2,"hoge[2]= ",hoge[2]) -- hoge[2]の要素を表示
		out(3,"hoge[3]= ",hoge[3]) -- hoge[3]の要素を表示
	end
}

おや?表示を見ると、

hoge[0] = nil
hoge[1] = 12.00
hoge[2] = 23.00
hoge[3] = 123.00

と表示されていますね。

つまり、添字を指定せずテーブルを初期化したときは、一番目の要素から順に1から始まる整数が添字としてあてがわれると言うことです。
hoge[0]のnil値は「兄さん、ここには役に立つ値がないよ」という意味です。

では、hoge[0]を使うことは出来ないのでしょうか?
やってみましょう。

Lua{
	hoge = {12,23,123} -- テーブル型変数hogeを宣言、一番目の要素が12,二番目の要素が23,三番目の要素が123
	hoge[0] = 774      -- hoge[0]に774を代入
	function main()
		out(0,"hoge[0]= ",hoge[0]) -- hoge[0]にちゃんと代入できてる?
		out(1,"hoge[1]= ",hoge[1]) -- hoge[1]の内容を表示
		out(2,"hoge[2]= ",hoge[2]) -- hoge[2]の内容を表示
		out(3,"hoge[3]= ",hoge[3]) -- hoge[3]の内容を表示
	end
}

これを実行すると

hoge[0] = 774.00
hoge[1] = 12.00
hoge[2] = 23.00
hoge[3] = 123.00

おや、ちゃんと代入出来ていますね。

では、もっと変なところも使ってみましょうか。

Lua{
	hoge = {12,23,123}   -- テーブル型変数hogeを宣言、一番目の要素が12,二番目の要素が23,三番目の要素が123
	hoge[0] = 774        -- hoge[0]の要素に774を代入
	hoge[3.14] = 3       -- ゆとり教育。添字に小数は使えるのかな?
	hoge[-2] = 1.93      -- 添字にマイナスは使えるのかな?
	function main()
		out(0,"hoge[0]= ",hoge[0]) -- hoge[0]にちゃんと代入できてる?
		out(1,"hoge[1]= ",hoge[1]) -- hoge[1]の要素を表示
		out(2,"hoge[2]= ",hoge[2]) -- hoge[2]の要素を表示
		out(3,"hoge[3]= ",hoge[3]) -- hoge[3]の要素を表示
		out(4,"hoge[3.14]= ",hoge[3.14]) -- 添字に小数は使えるの?
		out(5,"hoge[-2]= ",hoge[-2]) -- 添字にマイナスは使えるのかな?
	end
}

これを実行すると

hoge[0] = 774.00
hoge[1] = 12.00
hoge[2] = 23.00
hoge[3] = 123.00
hoge[3.14] = 3
hoge[-2] = 1.93

なにやら、添え字にはどんな数字でも使えそうですね。

実を言えば、添え字はnil値以外の任意の値が使えます。
ですから、以下のスクリプトは有効です

hoge = {}             -- 空のテーブル型変数hogeを宣言
hoge["weight"] = 550    -- hoge["weight"]に550を代入
hoge[1] = hoge.weight -- hoge.weightはhoge["weight"]と同じ事です。

さらに、数値型以外の型を交えて同じテーブルに含める事も出来ます。
これはとても強力な機能で、Luaをデータの扱いに柔軟な言語としています。