2016-10-01 23 views
2

ルア、 配列の部分を選択したいと思います。 [1]動作 以下の例では、Pythonで第二要素ルア、配列サブ要素

a = { 1, 2, 3} 
print(a) 

b = {} 
for i = 2, table.getn(a) do 
    table.insert(b, a[i]) 
end 
print(b) 

から選択します。 Luaにも同様の構文がありますか?

+1

'' 'table.getn(t)' ''私は悪い練習をしないでください。 '' '#t''を使用してください – warspyking

答えて

4

ルアには類似の構文がありません。しかし、独自の関数を定義してこのロジックを簡単にラップすることができます。これはbarからfoo内の要素の浅いコピーであることを

local function slice (tbl, s, e) 
    local pos, new = 1, {} 

    for i = s, e do 
     new[pos] = tbl[i] 
     pos = pos + 1 
    end 

    return new 
end 

local foo = { 1, 2, 3, 4, 5 } 
local bar = slice(foo, 2, 4) 

for index, value in ipairs(bar) do 
    print (index, value) 
end 

注意。


また、Luaの5.2で、あなたはtable.packtable.unpackを使用することができます。

local foo = { 1, 2, 3, 4, 5 } 
local bar = table.pack(table.unpack(foo, 2, 4)) 

マニュアルがあるが、これは言って:

table.packを(···)

キー1、2、等とに格納されたすべてのパラメータを使用して新しいテーブルを返しますフィールドの総数が「n」のフィールドがあります。結果の表はシーケンスではないことに注意してください。


のLua 5.3はtable.moveがありますが:

local foo = { 1, 2, 3, 4, 5 } 
local bar = table.move(foo, 2, 4, 1, {}) 

そして最後に、ほとんどは、おそらく、このオーバーOOP抽象化のいくつかの種類を定義することを選ぶでしょう。

local list = {} 
list.__index = list 

function list.new (o) 
    return setmetatable(o or {}, list) 
end 

function list:append (v) 
    self[#self + 1] = v 
end 

function list:slice (i, j) 
    local ls = list.new() 

    for i = i or 1, j or #self do 
     ls:append(self[i]) 
    end 

    return ls 
end 

local foo = list.new { 1, 2, 3, 4, 5 } 
local bar = foo:slice(2, 4) 
関連する問題