AutomagicTables(http://lua-users.org/wiki/AutomagicTables)を使ってLuaメタテーブルのヘルプが必要です。定義されていないテーブルに割り当てる機能は非常に便利です。この機能を維持したいと思います。私のバージョンは、単一の関数に配置されています:デフォルトと自動テーブル作成を伴うLuaテーブル
require("dataentry") -- Contains my age function
function AutomagicTable()
-- Create a new data table
-- from https://lua-users.org/wiki/AutomagicTables
local auto, assign
function auto(tab, key)
return setmetatable({}, {
__index = auto,
__newindex = assign,
parent = tab,
key = key
})
end
local meta = {__index = auto}
function assign(tab, key, val)
if val ~= nil then
local oldmt = getmetatable(tab)
oldmt.parent[oldmt.key] = tab
setmetatable(tab, meta)
tab[key] = val
else
return nil
end
end
return setmetatable({}, meta)
end
は、私が欲しいのは、フィールドが定義されていないときに使用するデフォルトのテーブルを渡すことです - PIL第13章(https://www.lua.org/pil/13.4.3.html)で説明したように。これは私のデータstrucutreの計算フィールドとルックアップフィールドを許可します。 nilのテーブル[「DOB」]として失敗し、このコードの年齢()に
t_defaults = {
Age = age(table["DOB"]),
Sex = "Female",
}
t = AutomagicTable(t_defaults)
t.ID12345.DOB = "7/2/1965"
t.ID12346.DOB = "1/2/1945"
print("ID12345",t.ID12345.Sex,t.ID12345.DOB,t.ID12345.Age)
print("ID12346",t.ID12346.Sex,t.ID12346.DOB,t.ID12346.Age)
注現在のテーブルのDOBフィールドへの参照(下記参照):以下は、私が使用したい構文です。このコードをデフォルト値がないところで実行すると、Automagicは欠損値のテーブルを返します。
私はPIL、第13章の例で、次のデフォルト値を割り当てることができますが、構文は厄介で、一度(私は別のメタテーブルを割り当てたとして)私はAutomagicTable機能を失う適用:「
-- Make a metatables
t_defaults = {}
t_defaults.__index = function (table, key)
local def = {
Age = age(table["DOB"]),
Sex = "Female"
}
return def[key]
end
-- Set new metatable - but now we can't make anymore Automagic tables
setmetatable(t.ID12345, t_defaults)
setmetatable(t.ID12346, t_defaults)
-- This will work
print("ID12345",t.ID12345.Sex,t.ID12345.DOB,t.ID12345.Age)
print("ID12346",t.ID12346.Sex,t.ID12346.DOB,t.ID12346.Age)
-- This assignment fails
t.ID12347.DOB = "12/12/1945"
残念ながら、私はドンAutomagicTablesコードを完全に理解し、AutomagicTableコード内に必要な機能を追加するのに苦労しています。
喜んでお寄せいただきありがとうございます。
ギャビン
感謝を。あなたの単一レベルのオートマチックははるかに理解しやすいです。 G – Gavin