luaを遊ぶ:luaの潜在的なルールを理解する

4547 ワード

LuaはC/C++コードで呼び出すことができ、逆にC/C++の関数を呼び出すこともでき、Luaが広く応用されている.Luaは標準Cで作成され、コードは簡潔で優美で、ほとんどのオペレーティングシステムとプラットフォームでコンパイルし、実行することができます.Luaは現在の解釈型スクリプトエンジンの中で最も速く,Lua埋め込みスクリプトの最適選択を決定する.文章はluaの使用中に出会った小さな問題を列挙して、まとめます.
if判断
luaはnilとfalseを“偽”と見なして、その他はすべて“真”です
論理演算子and or
luaのand orは、次のように三元式を構成するために使用できます.
> = 1 == 1 and 1 or 2
1
しかし、このように書くと、あなたが望んでいる結果ではありません.
> = 1 == 1 and false or true
true
これは、and演算子がfalseが成立しないと判定し、or演算子を実行し続けた結果
trueまたはfalseに戻らなければならない場合は、次のように書きます.
> = ( 1 == 1 and {false} or {true} )[1]
false

local変数宣言
local var1=1,var2
以上、var 1とvar 2の役割ドメインは異なり、var 1は存在する役割ドメインの変数であり、var 2はグローバル変数である可能性がある.実際に上記のコマンドを解釈するとvar 1に「1,var 2」からなる値の最初の値を取り、local var 1=...
正しい書き方は次のとおりです.
local  var1, var2=1
テーブルが空かどうか
if a == {} then
結果はfalseで、これは論理エラーで、実際にtable aのメモリアドレスと匿名tableの同じかどうかを比較します.
正しい書き方は次のとおりです.
if next(a) == nil then
複数の変数の割り当て
name,name = 1,2
名前はいくらですか?
実際にはname値は1であり,小さな例a,b=2,3,4の印刷為替符号化を書くことで見ることができる.方法:luac-l test.lua
tableのkeyルール
t[name]とt[“name”,t.name
1つ目と2つ目は異なり、1つ目はnameの値に基づいてkeyを、2つ目は「name」でkeyをします.この場合、次のようなことがあります.
t = {[name] = 1}
t = {name = 1}
t = {["name"] = 1}
tableの長さ
table長を取得する最も一般的な方法は#tableで、以下の通りです.
> t = {1,2,3}
> #t
3
ただし#オペレータにも限界があります
> t = { 10, n = 20, 30, 40 }
> #t
3
実際、#オペレータはtable内部配列空間のサイズを取得します.
> t = {}
> t[1] =1
> t[2] =1
> #t
2
> t[4] =1
> #t
4
また、要素をnilとすることで#tableの結果を変更できない(配列の最後の要素でない限り).そしてremoveは#tableの結果をすぐに更新できます
> t ={1,2,3}
> t[1]=nil
> #t
3
> table.remove(t,1)
nil
> #t
2
したがって、table長を取得し、要素タイプ(または連続性)が不確定な場合にfor in pairs、すなわちtableを遍歴する
tableリファレンス問題
1つのtableを別のtableにコピーし、この新しいtable値を変更すると元のtableに影響しますが、cloneでこの動作を変更できます.
--      ,t2   t1    ,   t2     ,t1          
local t1 = {a = 1, b = 2}
local t2 = t1
t2.b = 3    -- t1 = {a = 1, b = 3} 
cloneは元のlua内蔵関数ではありません.ここでもこの関数を補足します.
function clone(object)
    local lookup_table = {}
    local function _copy(object)
        if type(object) ~= "table" then
            return object
        elseif lookup_table[object] then
            return lookup_table[object]
        end
        local new_table = {}
        lookup_table[object] = new_table
        for index, value in pairs(object) do
            new_table[_copy(index)] = _copy(value)
        end
        return setmetatable(new_table, getmetatable(object))
    end
    return _copy(object)
end

関数の戻り値
> function f123() return 1, 2, 3 end
> function f456() return 4, 5, 6 end
> print(f123(), f456())
1       4       5       6
> print(f456(), f123())
4       1       2       3
> print(f456())
4       5       6
> print(f456(),1)
4       1
関数が列の最後にない場合は、1つの値のみが返されます.
浮動小数点数の問題
> math.floor(0.57*100)
56
これは浮動小数点数ともに精度が失われる問題であり,luaにもこの問題がある.整数と浮動小数点数の比較を見てみましょう.
> =10==10.00000000000000000
true
> =10==10.00000000000000001
true
> =10==10.00000000000000000
true
> =10==9.999999999999999999
true
2つの浮動小数点数が等しいかどうかを比較するにはどうすればいいですか?ここでは、次の方法を説明します.
function float_equal(x,v)
	local EPSILON = 0.000001
	return ((v - EPSILON) < x) and (x 
EPSILONは許容精度が悪い
lua整数
lua 5.3以前、luaには整数はなく、浮動小数点数で表され、最初のバージョンはfloatで、3.1以降はdoubleに変更されました.lua 5まで3,luaは整数を導入しただけで,デフォルトは64 bitである.前のluaバージョンが浮動小数点数を使用している以上、精度の問題があるに違いない.浮動小数点数は指数を表すために一部のビットが必要であり、doubleの有効数字は53 bitであり、表現できる最大の有効整数は6755399441055744であり、lua 5.3表現できる最大整数は922337203685475807です
なぜ6755399441055744なのかというと、寂しい同級生が書いた浮動小数点数から整数への急速な変換に興味があり、海外の文書Let's Get to the(Floating)Pointもある.
コロン構文
コロン構文は関数を定義するために使用できます.そうすると、関数には暗黙的なパラメータselfがあります. 
書き方は以下の通りです.
    function t:f (params) body end
コロン文法は実際には文法糖であり、以下のようなものです.
    t.f = function (self, params) body end
ここで補足例を説明します.
local t={a=123}

function t.f1(self, p)
	print(self.a, p)
end

function t:f2(p)
	print(self.a, p)
end

t:f1(1)
t.f1(t,1)
t:f2(1)
t.f2(t,1)
以上の結果はいずれも123 1
ここで、関数をコロンで呼び出すにはselfパラメータを追加する必要はありませんが、ドットは必要です.
2017/6/7補足lua論理演算子の説明
2016/1/19補足lua table長さの説明
2015/10/20 luaコロン文法の説明を補足
2015/10/8 lua整数の有効数字の説明を補充する
参照先:http://blog.csdn.net/mycwq/article/details/48765303