Lua:将表中的每个新元素设置为默认值

时间:2013-11-05 11:10:51

标签: hash lua lua-table

我想在字符串中获得最常见的k大小的子字符串。为此,我使用表来存储每个子字符串的出现次数。这是代码:

function frequentWords(seq, k)
  local subs = ""
  local counter = {}
  for i = 1,(seq:len()-k+1) do
    subs = seq:sub(i, i+k-1)
    counter[subs] = (counter[subs] and counter[subs] + 1 or 1)
    --print(subs .. ": " .. counter[subs])
  end
end

counter[subs] = (counter[subs] and counter[subs] + 1 or 1)行的平均值为counter[subs] = (counter[subs] ? counter[subs]+1 : 1)。如果我们可以使用counter[subs] = counter[subs] + 1设置每个新的counter元素,则此行仅为0。 Lua有可能这样吗?如果不是,那么做类似事情的最佳方式是什么?

例如,在Ruby中,这是通过声明这样的哈希来完成的:

counter = Hash.new(0)

2 个答案:

答案 0 :(得分:7)

您可以在__index中设置counter metamethod以返回0:

setmetatable(counter,{__index=function () return 0 end})

但这更容易,更清晰:

counter[subs] = (counter[subs] or 0) + 1

答案 1 :(得分:0)

对于您的情况,lhf的解决方案就足够了。为了完整起见,我想提一下更复杂的方法,它可以实现一些稍微复杂的功能。具体来说,当你将它与可变值一起使用时,它就像你期望的那样行事,例如table:它既创建了项目,又在创建时将它分配给密钥。

function defaultTable(constructor)
  local new = {}
  local function initIndex(key)
    local value = constructor()
    new[key] = value
    return value
  end
  setmetatable(new, {__index=initIndex})
  return new
end