Luaベース式

7143 ワード

Luaでは、式には、数値定数、文字列のフォント値、変数、単一および両目演算子、関数呼び出し、およびいくつかの非伝統的な関数定義およびテーブル構造が含まれます.
1.算術演算子
Luaは、通常の算術演算子:'+','-','*','/','^','%','-'(負)をサポートします.これらの演算子はすべて実数に役立ちます.例を挙げると、x^0.5は、xの平方根を計算し、x^(-1/3)、xの立方根の反数を計算します.
Luaでは、'%'演算子定義ルールは次のとおりです.
a%b == a - floor(a/b)*b
整数パラメータについては、通常の意味を表し、結果は2番目のパラメータbシンボルと同じである.
実数にはいくつかの追加の用途があります.たとえば、x%1はxの小数部、x-x%1はxの整数部を表します.同様に、x-x%0.01はxを小数点以下2桁に正確にする.
2.関係オペレータ
Luaは次の関係オペレータを提供します.
< > <= >= == ~=
これらのオペレータの結果はすべてtrueまたはfalseです.
'=='検査が等しいかどうか、'~='検査が等しくないかどうか.この2つのオペレータは、任意の2つの値に作用します.比較する2つの値が異なるタイプである場合、Luaはそれらが異なると考えている.そうでなければ、Luaはそれらのタイプによってそれらが等しいかどうかを比較する.特例では、nilはそれ自体に等しいだけです.
Luaは参照に基づいてtable,userdata,function,すなわち,両者が同じオブジェクトである場合にのみ等しい.例:
a = {}; a.x = 1; a.y = 0
b = {}; b.x = 1; b.y = 0
c = a

上のコードを実行すると、a==cが得られますが、a~=b
,<=,>=をorder operatorと呼ぶ.
order operatorは数値と文字列にのみ適用できます.Luaはアルファベット順で文字列の大きさを比較し,アルファベット順はローカル設定で決定する.非数値と文字列の値は、order operatorでは使用できません.
2つの異なるタイプの値を比較する場合は、「0」と「0」が異なることを覚えておいてください.それ以外は、2<15は明らかにtrueであるが、「2」
3.論理演算子
論理演算子には、and,or,notがあります.制御構造(if,whileなど)と同様に,すべての論理オペレータはfalseとnilをfalseと見なし,他の任意の値はtrueである.
and:最初のパラメータがfalseの場合、最初のパラメータを返します.そうでない場合、2番目のパラメータを返します.
or:最初のパラメータがfalseの場合、2番目のパラメータを返します.そうでない場合、最初のパラメータを返します.
print(4 and 5)              ----> 5
print(nil and 13)           ----> nil
print(false and 13)         ----> false
print(4 or 5)               ----> 4
print(false or 5)           ----> 5

'and'と'or'はshort-cutで計算されます.つまり、必要なときだけ、2番目のパラメータの値を計算します.これにより、(type(v)=「table」and v.tag=「h 1」)のような式がrun-time errorを生成しないことが保証される.(vがtableタイプでない場合、Luaはv.tagの値を計算しません).
有用なLua式:x=x or v、等価:
if not x then x = v end
(xがfalseに割り当てられていないことに加えて)、xが設定されていない場合は、デフォルト値vを与えます.
もう一つの有用なLua式:a and b or c、C式aに等価ですか?b:c、(bがfalseでないと仮定する).たとえば、xとyの最大値を次の文で得ることができます.
max = (x >y) and x or y
x>yの場合、最初のand式の結果は2番目のパラメータxであり、xは常にtrue(xは数値であるため)であり、or式の結果はx or yであり、結果はxである.
x
'not'オペレータは常にtrueまたはfalseを返します
print(not nil)             --> true
print(not false)           --> true
print(not 0)               --> false
print(not not nil)         --> false

4.接続オペレータ
Lua用'.'(2つの点)でstringコネクタを表します.いずれかのオペランドが数字の場合、Luaはそれをstringに変換します.
print("Hello " .. "World")  --> Hello World
print(0 .. 1)               --> 01

Luaのstringは定数であることを忘れないでください.string接続オペレータは、新しいstringを作成し、そのオペランドに変更はありません.
a = "Hello"
print(a .. " World")   --> Hello World
print(a)               --> Hello

5.優先度
Luaのオペレータ優先度は、次の表に示すように、高いものから低いものまでです.
^
not    #    -(  )
*      /    %
+      -
..
<      >    <=    >=    ~=    ==
and
or

'^と'...'を除いて、すべての両目オペレータは左に関連付けられています.したがって、次の表では、左の式と右の式が等価です.
a+i < b/2+1         (a+i) < ((b/2)+1)
5+x^2*8              5+((x^2)*8)
a    (a     -(x^2)
x^y^z                x^(y^z)

疑問がある場合は、カッコ'()'を使います.これはマニュアルを調べるよりも便利で簡単です.また、後でコードを見ると、同じ疑問があるかもしれません.カッコ'()'を明示的に使うと、より直感的になります.
6.テーブル構築関数
コンストラクション関数は、テーブルを初期化するための式です.それはLuaの独特な特性と強力な機能の一つです.
最も簡単なコンストラクション関数は空コンストラクション関数,{}であり,空tableを作成する.コンストラクション関数は、配列を初期化することもできます.たとえば、次のようにします.
days = {"Sunday", "Monday", "Tuesday", "Wednesday", 
        "Thursday", "Friday", "Saturday"}

day[1]を「Sunday」、day[2]を「Monday」に初期化します.indexは1からです.
.
print(day[4])      --> Wednesday

Luaはrecord-like tableを初期化するための専門的な構文を提供し、以下のようにします.
a = {x=10, y=20}

に等しい
a = {}, a.x = 10; a.y = 20

どの構造関数を使用してtableを作成しても、結果のfieldを増やしたり減らしたりすることができます.
w = {x=0, y=0, label="console"}
x = {math.sin(0), math.sin(1), math.sin(2)}
w[1] = "another filed"   -- add key 1 to table 'w'
x.f = w                  -- add key 'f' to table 'x'
print(w["x"])            --> 0
print(w[1])              --> another field
print(x.f[1])            --> another field
w.x = nil                -- remove field 'x'

すなわちtable作成プロセスは同じである.コンストラクション関数は、それを初期化するだけです.
Luaはコンストラクション関数を使用するたびに、新しいtableを作成して初期化します.したがって、tableを使用してlistを実現することができます.
list = nil
for line in io.lines() do
    list = {next=list, value=line}
end

これらのコードはstdinからローに読み込まれ、listに格納され、読み込まれた順序とは逆の順序になります.listの各nodeには2つのfield:valueがあり、行の内容、next、次のnodeを指します.次のコードはこのlistを巡回し、その内容を印刷します.
local l = list
while l do
    print(l.value)
    l = l.next
end

次の2つのコードの例を示します.
(スタック上でlistを実現したので、印刷時は逆シーケンスになります).実装は便利であるが,Luaプログラムではこのように実装されたlistをあまり使用しない.Listはarrayとしてよりよく実現できるので,後でこの問題について述べる.
構造関数でrecord-styleとlist_を同時に使用できます.styleの初期化方法:
polyline = {color="blue", thickness=2, npoints=4,
      {x=0,  y=0},
      {x=-10, y=0},
      {x=-10, y=1},
      {x=0,  y=1}
     }

上記の例では、ネストされた構造関数を使用して、より複雑なデータ構造を表す方法も説明しています.各polyline[i]はtableであり、レコード(record)を表す.
print(polyline[2].x)   --> -10  --     index 1       ,     may be helpful
print(polyline[4].y)   --> 1

この2つの形式の構造関数(record-styleおよびlist_style)にはいくつかの限界がある.いくつかの負数またはstringは識別子として使用できません.
従って、Luaはより一般的なフォーマットを提供する.このフォーマットでは、各[index]を明示的に書きます.
opnames = {["+"] = "add", ["-"] = "sub", 
           ["*"] = "mul", ["/"] = "div"}

i = 20; s = "-"
a = {[i+0] = s, [i+1] = s..s, [i+2] = s..s..s}

print(opnames[s])   --> sub
print(a[22])        --> ---

このルールはちょっと面倒ですが、もっと便利で柔軟です.record-styleとlist_styleはこの汎用フォーマットの2つの特例にすぎない.
{x=0, y=0}         <==>    {["x"]=0, ["y"]=0}
{"r", "g", "b"}    <==>    {[1]="r", [2]="g", [3]="b"}

時々、arrayのindexを0から(Luaデフォルトは1から)望んで、次の方法でいいです.
days = {[0]="Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}

これで、最初の値は「Sunday」で、indexは0です.他のfieldには影響しません「Monday」のindexは1で、コンストラクション関数の最初のlist値であるためです.その他のフォロー.実現は便利ですが、おすすめしません.Luaの多くの内蔵関数はarrayのindexが1から始まると仮定しており,arrayが0から始まると処理に問題がある可能性がある.
最後の要素の後ろにカンマ','を付けることができます.この末尾のカンマ','はオプションですが、合法的です.
a = {[1]="red", [2]="green", [3]="blue",}

この利便性により,プログラムはLua tableを生成する際に最後の要素を特別に処理する必要がない.
最後に、セミコロン';'を使用できます.カンマの代わりに「,」を使ってもいいです.を使用して、tableの異なるプロパティの部分を分割します.たとえば、次のようにします.
{x=10, y=45; "one", "two", "three"}

レベルが限られています.もし友达が間違いを発見したら、伝言交流を歓迎します.