31

Lua では、要素を配列に追加する方法が 2 つあります。

table.insert(t, i)

t[#t+1] = i

どちらを使用する必要がありますか? なぜですか?

4

4 に答える 4

40

どちらを使用するかは好みと状況の問題です。#長さ演算子はバージョン 5.1 で導入されたt[#t+1] = iため、Lua 5.0 では機能しませんがtable.insert、5.0 から存在し、両方で機能します。一方、t[#t+1] = i言語レベルの演算子のみを使用しますtable.insertが、関数には関数が含まれます (検索と呼び出しにわずかなオーバーヘッドがありtable、環境内のモジュールに依存します)。

Programming in Luaの第 2 版(Lua 5.0 指向の第 1 版の更新版) で、Roberto Ierusalimschy (Lua の設計者) はt[#t+1] = i、より見やすいので を好むと述べています。


また、ユースケースによっては、答えが「どちらでもない」場合があります。長さ演算子の動作に関するマニュアルのエントリを参照してください。

配列に「穴」(つまり、他の非 nil 値の間にある nil 値) がある場合、 #t は、nil 値の直前の任意のインデックスにすることができます (つまり、そのような nil 値を末尾と見なすことができます)。アレイの)。

そのため、穴のある配列を扱っている場合、いずれかをtable.insert使用すると (長さ演算子を使用します)、配列内の必要なインデックスよりも低いインデックスに値が「追加」される可能性があります。このシナリオで配列のサイズをどのように定義するかはあなた次第であり、これも好みと状況に依存します: 使用できますtable.maxn(5.2 では消えますが、書くのは簡単です)、nテーブルにフィールドを保持して更新することができます必要に応じて、テーブルをメタテーブルでラップするか、状況により適した別のソリューションを使用できます (ループでは、ループlocal tsizeのすぐ外側のスコープで十分です)。

于 2011-05-24T15:36:37.593 に答える
6

The following is slightly on the amusing side but possibly with a grain of aesthetics. Even though there are obvious reasons that mytable:operation() is not supplied like mystring:operation(), one can easily roll one's own variant, and get a third notation if desired.

Table = {}
Table.__index = table                     

function Table.new()
   local t = {}
   setmetatable(t, Table)
   return t
end

mytable = Table.new()
mytable:insert('Hello')
mytable:insert('World')
for _, s in ipairs(mytable) do
   print(s)
end
于 2011-05-31T19:18:07.660 に答える
1

insert任意に (その名前が示すように) 挿入できます。デフォルトは のみ#t + 1であり、ast[#t + 1] = iは常にテーブル (の最後) に追加されます。lua マニュアルのセクション 5.5 を参照してください。

于 2011-05-24T15:32:18.123 に答える
0

'#' 演算子は、インデックス付きキー テーブルのみを使用します。

t = {1, 2 ,3 ,4, 5, x=1, y=2}

上記のコードで

print(#t)  --> print 5 not 7

使用していないときは常に「#」演算子。

'#' 演算子を使用する場合は、テーブル要素の型にチェックを入れます。

挿入関数は任意の型を使用できますが、要素カウントは「#」よりも遅くなります

于 2016-08-02T12:02:02.587 に答える