この第1版は、Lua 5.0用に書かれました。後のバージョンでは大まかに関連しているものの、いくつかの違いがあります。
第4版は Lua 5.3 を対象にしており、Amazon やその他の書店から入手できます。
この本を購入することで、Lua プロジェクトのサポートにも役立ちます。
![]() |
でプログラミングLua | ![]() |
| パートII. テーブルとオブジェクト 第11章. データ構造 |
insert と remove (tableライブラリから) を使用してキューを簡単に実装できますが、この実装は、構造が大きい場合にはあまりにも遅くなる可能性があります。より効率的な実装には、先頭要素と最後尾要素の2つのインデックスを使用します。
function ListNew ()
return {first = 0, last = -1}
end
グローバル空間の汚染を避けるために、リストのすべての操作をテーブル内に定義します。適切にはListと呼ばれます。そのため、最後の例を以下のように書き直します。 List = {}
function List.new ()
return {first = 0, last = -1}
end
今や、両方の端に要素を挿入または削除して一定時間でできます。 function List.pushleft (list, value)
local first = list.first - 1
list.first = first
list[first] = value
end
function List.pushright (list, value)
local last = list.last + 1
list.last = last
list[last] = value
end
function List.popleft (list)
local first = list.first
if first > list.last then error("list is empty") end
local value = list[first]
list[first] = nil -- to allow garbage collection
list.first = first + 1
return value
end
function List.popright (list)
local last = list.last
if list.first > last then error("list is empty") end
local value = list[last]
list[last] = nil -- to allow garbage collection
list.last = last - 1
return value
end
この構造を厳密なキュー規律で使用して、pushright と popleft のみを呼び出すと、first と last は継続的に増加します。しかし、Luaの配列はテーブルで表現されるため、それらを1から20、あるいは16,777,216から16,777,236でインデックスできます。さらに、Luaは倍精度で数を表現するため、プログラムは200年間実行されて毎秒100万回挿入を行った後でも、オーバーフローの問題は発生しません。
| 2003–2004 Roberto Ierusalimschyの著作権所有。すべての権利は留保されています。 | ![]() |