- 追加された行はこの色です。
- 削除された行はこの色です。
*Luaリファレンス 要注意点 ~配列~ [#a5bdcc78]
**index番号は"1"から [#w28c539c]
-配列はLUAではINDEX==1 から始めます。~
様々な関数が、それを前提とした作りになっていますので、~
強引に「0」から開始したりはせず、素直に「1」からにしましょう。~
~
また、#が配列の長さになりますので、~
#sh(lua){{
a[#a+1] = v
}}
などで、リストの最後に追加というイディオムとなります。~
**配列の0からのインデックス [#x9e81052]
-配列のインデックスを強引に0からにした例
#sh(lua){{
days = { [0] = "Sunday", "Monday", "Tuesday", ..... }
}}
というようにインデックス[0]を書いておけば良い。~
#sh(lua){{
arr = { 1,2,3,[0]=0 }
}}
というように、位置はどこでも良い。~
~
ただし、''Luaでは多くの関数が、配列1からのスタートを前提とした設計になっているので、このようなことは避けたほうが賢明''
**配列の間に"nil"がある場合、#による長さはあてにならない [#tcf9f4d0]
-配列の要素にnilがあると、#は非常にわかりにくいアルゴリズムとなってしまうため~
まともに使えません。~
配列の要素にnilがある場合は、#やipairsを使わないようにしましょう。
#sh(lua){{
local a = {1,2,3,nil,5,nil}
print(#a) --> 3
local a = {1,2,3,nil,5}
a[4] = nil
print(#a) --> 5
a[6] = nil
print(#a) --> 3
a[6] = 6
print(#a) --> 3
local a = {1,2,3,nil,5,nil}
print(#a) --> 3
a[6] = 6
print(#a) --> 6
a[6] = nil
print(#a) --> 3
a[7] = 7
print(#a) --> 3
}}
というように、理解しがたい値が返ってきます。
**配列の間に"nil"がある場合、ipairsはそこで終了 [#de510679]
-ipairsがnilで終了してしまうことも、引っかかりやすい挙動です。
#sh(lua){{
local a = {1,2,3,nil,5}
for k, v in ipairs(a) do
print(k, v)
end
-- 1 1
-- 2 2
-- 3 3
}}
**配列が空は、「not next (対象テーブル)」と判定[#w59cbd3a]
>
#sh(lua){{
mytable = {};
if not next mytable then
print "It's empty"
end
}}
関連項目 => [[table.empty>Lua implements_func_table#table_empty]]
~
**初期化 [#d1ce2453]
-最後のカンマは付いていても問題ない
#sh(lua){{
arr = { 1,2,3, }
}}
-セミコロンを使うことも可能なので、意味的なセパレータ代わりに使うと良い
#sh(lua){{
arr = { 1,2,3; 10,11,12; }
}}
**配列タイプ(indexタイプ)のテーブルの高速複製は「newtbl = { unpack(oldtbl) }」 [#l2e3a7ee]
#sh(lua){{
--一番良く利用する配列タイプのテーブルのシャロウコピーの場合、関数すら不要です。
local old_tbl = {5,8,"abc", "あいう"}
local new_tbl = { unpack(old_tbl) } -- テーブルをリスト化してテーブルとすることでシャロウコピーとなる。 5.2以降は { table.unpack(old_tbl) }
}}
**indexが-5から5の配列を作成 [#bd35f4ff]
>~
#sh(lua){{
a = {}
for i=-5, 5 do
a[i] = 0
end
}}
**行列と多次元配列 [#pc8fb990]
>~
#sh(lua){{
mt = {} --行列の作成
for i=1, N do
mt[i] = {} --行
for j=1, M do
mt[i][j] = 0
end
end
}}
**デフォルトの値を持つテーブル [#ze8d788a]
-簡単版。未知のフィールドは、全てデフォルトの値が0
#sh(lua){{
function setDefault(t, d)
local mt = {__index = function() return d end } -- メタテーブルで指定の初期値
setmetatable(t, mt)
end
local tab = {x=10, y=20}
print(tab.x, tab.z) -->10, nil
setDefault(tab, 0)
print(tab.x, tab.z) -->10, 0
}}
~
-ガベージ意識版。未知のフィールドは、全てデフォルトの値が0
#sh(lua){{
local defaults = {}
setmetatable(defaults, {__mode = "k" } ) -- defaults は弱いキーを持つ。使われていないキーは回収可能とする。
local mt = {__index = function (t) return defaults[t] end }
function setDefault(t, d)
defaults[t] = d --そのテーブル自身をキーとしてデフォルト値を持つ
setmetatable(t, mt)
end
tab = {x=10, y=20}
print(tab.x, tab.z) -->10, nil
setDefault(tab, 0)
print(tab.x, tab.z) -->10, 0
}}
~
-ガベージ意識版&メモ化版。未知のフィールドは、全てデフォルトの値が0
#sh(lua){{
local metas = {}
setmetatable(metas, {__mode = "v" }) -- 弱い値にすることで、いざとなれば、使われていないメタテーブルは回収可能とする。
function setDefault(t, d)
local mt = metas[d]
if mt == nil then
mt = {__index = function() return d end }
metas[d] = mt -- 新たなメタテーブルであれば、それをメモ化
end
setmetatable(t, mt)
end
tab = {x=10, y=20}
print(tab.x, tab.z) -->10, nil
setDefault(tab, 0)
print(tab.x, tab.z) -->10, 0
}}
~