LuaについてInsert and pairs(t)の発見(真偽が分からない)

8591 ワード

Luaメタテーブルを勉強している間に出会った:
--        ,table.maxn Lua5.2          
--               table_maxn,         
function table_maxn(t)
    local mn = 0
    for k, v in pairs(t) do
        if mn < k then
            mn = k
        end
    end
    return mn
end

--       
mytable = setmetatable({ 1, 2, 3 }, {
  __add = function(mytable, newtable)
    for i = 1, table_maxn(newtable) do
      table.insert(mytable, table_maxn(mytable)+1,newtable[i])
    end
    return mytable
  end
})

secondtable = {4,5,6}

mytable = mytable + secondtable
        for k,v in ipairs(mytable) do
print(k,v)
end

これは難しくありません:出力1から6です
1	1
2	2
3	3
4	4
5	5
6	6

しかしsecondtableの5をnilに変更するとsecondtable={4,nil,6}出力が
1	1
2	2
3	3
4	4
5	6

考えても分からないままinsertとpairsのドキュメントを見に行きました.
table.insert (list, [pos,] value)
listの位置posに要素valueを挿入し、要素list[pos],list[pos+1],......,list[#list]を後ろに移動します.posのデフォルト値は#list+1なのでtableを呼び出す.Insert(t,x)は、リストtの末尾にxを挿入します.
pairs (t)
tにメタメソッドがある場合_pairsは、tをパラメータとして呼び出し、返される最初の3つの値を返します.
そうでなければ、next関数、テーブルt、nilの3つの値が返されます.したがって、次のコードは
 for k,v in pairs(t) do body end

t内のすべてのキー値ペアを反復することができる.
反復中にテーブルを変更するリスクについては、関数nextを参照してください.
nilについても話していないので、私は以下の2つの構想を提出しました(私が前の知識をよく勉強していないかもしれません).
----1.table.insert     nil

テストコード:
t1 = {1,2,3,4}

print('t1:  before insert :' .. table.concat(t1,' , '))

table.insert(t1,nil)

print('t1:  insert nil    :' .. table.concat(t1,' , '))

table.insert(t1,5)

print('t1:  insert 5      :' .. table.concat(t1,' , '))

出力:
t1:  before insert :1 , 2 , 3 , 4
t1:  insert nil    :1 , 2 , 3 , 4
t1:  insert 5      :1 , 2 , 3 , 4 , 5

表示:nilを挿入できませんか?
--  :
--2.pairs   nil

テストコード:
t2 = {1,2,3,nil,5}

print(t2[4])   --         nil ,     nil

for k,v in pairs(t2) do
	print(k .. ':' .. v)
end

出力は次のとおりです.
nil       --print(t2[4])
1:1
2:2
3:3
5:5

表示:nilを出力できませんか?
以上のように??みんなは正しいと思いますか?いやちょっと言ってくれよ^u^