web-dev-qa-db-ja.com

table.insert(t、i)とt [#t + 1] = iの違いは何ですか?

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

table.insert(t, i)

そして

t[#t+1] = i

どちらを使用する必要がありますか。その理由は何ですか。

29
Eric

どちらを使用するかは好みと状況の問題です。#長さ演算子はバージョン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で十分です) )。

38

以下は少し面白くしていますが、おそらく美的要素があります。 mytable:operation()mystring:operation()のように提供されていないことには明らかな理由がありますが、自分のバリアントを簡単にロールでき、必要に応じて3番目の表記を取得できます。

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
7
AndersH

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

1
Necrolis

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

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

上記のコードで

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

使用しない場合は常に「#」演算子。

「#」演算子が必要な場合は、それをチェックしてテーブル要素タイプにチェックします。

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

0
gogothing