Lua_第3章式


第3章式
Luaの式には、数値定数、文字列定数、変数、一元演算子、二元演算子、関数呼び出しが含まれます.非伝統的な関数定義とテーブル構造も可能です.
3.1算術演算子
二元演算子:+-*/^(加減乗除軍)
単項演算子:-(負)
これらの演算子のオペランドは実数です.
3.2関係演算子
      <=     >=     ==     ~= 
これらのオペレータはfalseまたはtrueの結果を返します.==和~=2つの値を比較し、2つの値のタイプが異なる場合、Luaは両者が異なると考えている.nilは自分としか等しくない.Luaはtables,userdata,functionsを参照により比較する.すなわち、両者が同一のオブジェクトを表す場合にのみ等しい. 
a = {}; a.x = 1; a.y = 0
b = {};b.x = 1; b.y = 0c =a
a==c buta~=b

Lua比較数字は従来の数字サイズで行われ,比較文字列はアルファベット順で行われるが,アルファベット順はローカル環境に依存する.
異なるタイプの値を比較する場合は、次の点に注意してください.
 
"0" == 0      -- false
2 < 15        -- true
"2" < "15"    -- false (alphabetical order!)

一致しない結果を避けるために、比較数字と文字列を混合すると、Luaは2<「15」などのエラーを報告します.
3.3論理演算子
and    or     not
論理演算子はfalseとnilが偽(false)であり、その他は真であり、0もtrueであると考えている.
andとorの演算結果はtrueとfalseではなく,その2つのオペランドに関連している.
 a and b       --    a   false,    a,     b
a or b       --    a   true,    a,     b

例:
xがfalseまたはnilの場合、xに初期値vを付与する実用的なテクニックです.
x = x orv

に等しい
if not xthen
x = v
end

andの優先度はorより高い.
C言語における三元演算子
a ? b : c

Luaでは次のように実現できます.
(a and b)or c

notの結果はfalseまたはtrueを返します
print(not nil)          --> true
print(not false)        --> true
print(not 0)            --> false
print(not not nil)      --> false

3.4連結演算子
..--2点
文字列接続、オペランドが数字の場合、Luaは数字を文字列に変換します.
print("Hello" .."World")      --> Hello World
print(0 .. 1)                   --> 01

3.5優先度
高い順から低い順:
^
not  -  (unary)
*     /
+    -
..
 
<    >      <=    >=    ~=   ==
and
or

^と..を除いて外のすべての二元演算子は左に接続されています.
a+i < b/2+1            (a+i) < ((b/2)+1)
 
5+x^2*8                 5+((x^2)*8)
a < y         and y<=z(a < y) and (y <=z)
-x^2                         -(x^2)
x^y^z                       x^(y^z)

3.6表の構造
コンストラクタは、テーブルを作成および初期化する式です.時計はLuaならではの機能が強いもの.最も簡単なコンストラクション関数は、空のテーブルを作成するために{}です.配列を直接初期化できます.
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday","Saturday"}

Luaは「Sunday」初期化days[1]Cの最初の要素を1)にインデックスし、「Monday」で初期化days[2]...
print(days[4])       --> Wednesday

コンストラクション関数は、任意の式で初期化できます.
tab ={sin(1), sin(2), sin(3),sin(4),
sin(5),sin(6), sin(7),sin(8)}

テーブルをrecordとして初期化するには、次のようにします.
a = {x=0,y=0}              a = {}; a.x=0;a.y=0

どのようにtableを作成するかにかかわらず、テーブルに任意のタイプのドメインを追加または削除することができます.コンストラクション関数はテーブルの初期化にのみ影響します. 
w = {x=0,y=0, label="console"} x = {sin(0),sin(1), sin(2)} 
w[1] ="another field"
x.f = w
print(w["x"])     --> 0  
print(w[1])       --> another field 
print(x.f[1])     --> another field
w.x = nil        -- removefield "x"
 
   
 
   

,Lua table, table list:

list = nil
  forlinein io.lines()do
  list ={next=list, value=line}
end

このコードは から に み まれ、 シーケンスでチェーンテーブルが されます. のコードは、チェーンテーブルの を します.
l =list
 whileldo
   print(l.value) 
     l = l.next
end

じコンストラクション で、リストスタイルとrecordスタイルをブレンドして できます.たとえば、 のようにします.
polyline ={color="blue", thickness=2, npoints=4,
    {x=0,   y=0},
    {x=-10, y=0},
    {x=-10, y=1},
     {x=0,   y=1}
}
 
   

.

print(polyline[2].x)     --> -10

の2つのコンストラクション の には、 のインデックスを してテーブル の を することはできません. インデックスも に すことはできません. では、[expression]で される されるインデックスを すより な について します.
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])         --> ---

list record :

{x=0, y=0}               {["x"]=0, ["y"]=0}
{"red", "green", "blue"}        
{[1]="red", [2]="green", [3]="blue"}

0 :

days = {[0]="Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}

: 0 , 。 "," , 。 

a ={[1]="red", [2]="green", [3]="blue",}

C",") C";") , 。 

{x=10, y=45;"one","two","three"}