Lua学習ノート(二)


一、オペレータの概要
C言語のように、Luaのオペレータもよく見られるいくつかです.例えば、算数類には、加減乗除、モデリング、指数、マイナス記号があります.関係クラスには、大きい(等)于、小さい(等)于、等しいと等しくない.論理クラスには、とまたは非があります.
算数類はすべて常識で、言うまでもなく、まず関係類を見てみましょう.
Luaの関係操作演算結果はtrueまたはfalseであり、ここでは「~=」で表されるに等しくないが、ここで注意すべきは、等性比較の両側については同じタイプを有し、そうでなければ直接trueに戻ることである.比較に関与する2つのタイプが等しい場合、2つのタイプに基づいてさらに比較されます.たとえば、数値タイプは数値サイズで比較され、tableは引用比較、すなわち内容を比較せず、引用の対象を比較します.本の例を挙げます.
a = {}
b = {}
a.x = 1; a.y = 0
b.x = 1; b.y = 0
c = a

--         :a  c,a   b,b   c

サイズ比較の場合、数値と数値、文字列と文字列の比較が望ましい.Luaは文字列をアルファベット順に順番に比較し、数値と文字列の比較でエラーが発生します.他のタイプはサイズペアとして使用できません.
論理クラスについては、and,or,notに対応します.和または操作、すなわちa and b,a or bは、aおよびbがnilに等しくない場合、tureまたはfalseを返す.nilがある場合はnilを返す可能性があり、nilとfalseを「偽」と呼び、その他を総称して「真」と呼ぶ.以下はテスト例です.
a = 1
b = 6
c = false
print(a and b)
print(b and a)
print(a and c)
print(b and true)
print(a and nil)
print(c and a)
print(a or b)
print(b or a)
print(b or c)
print(c or b)
print(true or a)
print(c or nil)
print(nil or c)

--[[    : 6 1 false true nil false 1 6 6 6 true nil false --]]

and操作の場合、左が真であれば右の値を返し、左が偽であれば右をスキップし、左の値を返す.or操作の場合、左が真であれば右をスキップし、左の値を返し、左が偽であれば右の値を返します.
not操作は逆を取り、tureやfalseに戻ることに注意しなければならないのは、0は実数であり、Luaでは真を表し、空の文字列も真であり、not 0の結果とnot」の結果がfalseであることだ.これは混同しやすい.私はプロジェクトでこのようなバグに遭遇したことがある.覚えておいて!いくつかのnotの使い方をテストします.
a = 1
b = "x"
print(not a)
print(not false)
print(not nil)
print(not true)
print(not b)
print(not 0)

--[[    : false true true false false false --]]

いくつかのチュートリアルのテクニックを見てみましょう.
x = x or v
このコードは、xが設定されていないときにデフォルト値vを与えることができる.解析:x or vは、xに付与値があり、nilとfalseでない場合、xを返し、xに付与値(=nil)がない場合、falseが付与されていない場合、vを返します.
(a and b)or c-bは偽りではない
このコードはC言語のaに等しいですか?b:c,分析:bが真である前提の下で、aが偽であれば、a and bが偽であり、aを返し、a or cがcを返すので、式はcを返す.aが真であり、a and bが真であり、bを返し、b or cがbを返すと、式はbを返す.aに合致する?b:cのルール.
以上がLuaのオペレータベースであり,以下ではそれらの優先度を見る.(高さから低さまで)
^(指数演算)
not,#(長さオペレータ),-(マイナス)
*,/,%
+、-(マイナス記号)
..(文字列接続)
<,>,<=,>=,~=,==
and
or
二、文の紹介
LuaとCの差は多くなく、付与操作は等号の右の値を左に与え、ifとwhileの制御文もあるが、文法に注意しなければならない.
if制御構造:if条件then結果end,elseがある場合if条件then結果1 else結果2 end,多重ネストがある場合:
--   

if   1 then

  1

elseif   2 then

  2

else   3 then

  3

end

ここで注意しなければならないのは、条件の後にthenがあることを忘れないでください.制御構造全体が終わるとendが漏れません.Cの影響で最初は無視しがちでしたが、付けないとsyntax errorが発生してしまい、長くなれば良いのです.ネスト時にelseとifは分離されず、else ifと書くと間違っています.
while制御構造:while条件doサイクルend
Cと同様に,まず条件を検出し,真であれば循環体に1回入り,偽であれば脱退する.ここで注意したいのは、条件の後にdoがあることを無視しないで、最後にendがあることを忘れないでください.
repeat制御構造:repeatサイクルuntil条件
すなわちC言語のdo-while構造は,まずループ体を実行し,条件を判定し,真であればループを継続し,偽であれば終了する.ここで注意したいのは、この循環体は少なくとも1回実行され、構造全体にendがなく、勝手に追加しないことです.ループボディにlocal宣言のローカル変数がある場合は、untilの条件テストでもこの変数を使用できます.
forループ(デジタルタイプ):for var=exp 1,exp 2,exp 3 doループend
この意味は、変数varがexp 1からexp 2に変化し、変化するたびのステップ長がexp 3である.ここでexp 3は指定しなくてもよいので、デフォルトは1です.exp 2はmathに設定ことができる.hugeは、上限を設けない.注意しなければならないのは、ここforの条件内容は括弧で抱く必要はありません.条件の後ろにdoが付いていて、エンディングにendがあって、漏れないようにしてください.forの後の3つの式は、ループが開始される前に評価され、1回のみ実行され、制御変数は自動的にforのローカル変数として宣言され、ループが終了すると存在しません.
breakとreturn:breakは、その内部ループを含むジャンプであり、多重ループでは、内部から飛び出した後、外部の階層で実行されます.returnは、関数から結果を返すか、関数の実行を終了します.
以上はC言語に似たいくつかの文ですが、Luaの特殊な文を見てみましょう.
まず、Luaは多重代入をサポートし、等号の右の数を左の数と一致するように調整します.例を見てみましょう.
a,b,c,d,e = 1,2,3,4,5,6,7
print(a,b,c,d,e)

i,j,k,l,m,n = 1,2,3
print(i,j,k,l,m,n)

x=10
y=26
print(x,y)
x,y = y,x
print(x,y)

--[[   : 1 2 3 4 5 1 2 3 nil nil nil 10 26 26 10 --]]

多重代入の場合,右の個数が左より大きい場合,順次代入後,余分なものを捨てることが分かる.右の個数が左より小さい場合は、左に値を付けていないnilを置きます.3つ目の例は交換操作であり、C言語のようにtemp中間数で2つの数を交換する必要はありません.多重賦値では、Luaが等号の右側の要素を先に評価し、それから賦値するからです.
変数タイプ:Luaにはグローバル変数とローカル変数があります.
変数を宣言するには、int、float、charなどのタイプは必要ありません.Luaはあなたの付与値に基づいて、この変数のタイプを自動的に判断します.値を割り当てない場合は、デフォルトでnilが与えられます.したがって、Luaにはグローバル変数とローカル変数しかなく、ローカル変数は変数の前にlocal、例えばlocal x=0を加え、このxはローカル変数であり、この宣言が1つのループにあると、ループが終了した後、変数は使用できなくなる.すなわち、ローカル変数の役割ドメインは、そのブロックを宣言するものである.ループボディ、関数ボディ、Luaに加えて、ブロックを定義するには、次の文を使用します.
doプログラム体end
インタラクションモードでこのモードを使用すると便利で、doに遭遇するたびに、解釈器はendに遭遇するまで1行1行の文を単独で実行せず、localローカル変数をうまく含めることができます.局所変数をできるだけ多く使用することもLuaの著者が提唱したもので、結局このようにするのは効率が高く、グローバル環境を汚染することを避け、ゴミ収集器が不要な変数を回収するのに便利である.
最後に、汎用forサイクル(前述のデジタルforとは異なる)を見てみましょう.
for i,v in ipairs(配列table)do実行体end
for k,v in pairs(汎用table)do実行体end
汎用forは、tableのすべての値を巡回するために銅ドラム反復器関数です.この2つは汎用forの構文であり、pairsは反復table要素であり、keyは数値ではなく、ループごとにkがインデックスに割り当てられ、vがインデックス対応値に割り当てられる.一方、ipairsは反復配列要素であり、keyは数値であり、ループごとにiはインデックス値、vは対応するインデックスの配列要素値である.汎用forは簡単そうに見えますが、Luaでは機能が非常に強く、使用も広く、例えばゲームプロジェクトをするときに、道を探したり、地図を巡ったり、衝突検出をしたりすることができます.簡単な例を見てみましょう
tbl={a = 6, b = 9, yes = 1, no = 0}
for k,v in pairs(tbl) do
print(k.." ".."=".." "..v)
end

--[[   : a = 6 b = 9 yes = 1 no = 0 --]]


test={[1] = "yes", [2] = "Tuesday", [3] = "March"}
for i,v in ipairs(test) do
print(i.." ".."=".." "..v)
end

--[[   : 1 = yes 2 = Tuesday 3 = March --]]

汎用forについては、反復器の説明でさらに詳しく説明します.今回の学習ノートはこれで終わり、次回は関数の学習に入ります.