*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が-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 }} ~