最近、Lee Baldwinが汎用の可変引数 memoize 関数の書き方を示しました。必要なパラメーターが 1 つだけの、より単純な関数を返す方がよいと考えました。これが私の総偽の試みです:
local function memoize(f)
local cache = {}
if select('#', ...) == 1 then
return function (x)
if cache[x] then
return cache[x]
else
local y = f(x)
cache[x] = y
return y
end
end
else
return function (...)
local al = varg_tostring(...)
if cache[al] then
return cache[al]
else
local y = f(...)
cache[al] = y
return y
end
end
end
end
明らかに、select('#', ...)
このコンテキストでは失敗し、とにかく私が望むことを実際には行いません。memoize内でfが期待する引数の数を知る方法はありますか?
確実にわかっている場合は、「いいえ」で結構です。2 つの別個のmemoize関数を使用することは大したことではありません。