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

我想在一个字符串中获取最常出现的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) 意思相同。如果我们可以用 0 设置每个新的 counter 元素,那么这行代码只会变成 counter[subs] = counter[subs] + 1。在 Lua 中是否可以实现?如果不行,最好的方法是什么?

例如,在 Ruby 中,可以通过声明一个如下的哈希表来实现:

counter = Hash.new(0)
点赞
用户107090
用户107090

你可以在 counter 中设置一个 __index 元方法来返回 0:

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

但是下面这行代码更加简单明了:

counter[subs] = (counter[subs] or 0) + 1
2013-11-05 11:15:04
用户2895784
用户2895784

针对你的情况,lhf的解决方案已经足够。但为了完整起见,我想提到一种更复杂的方式,它可以实现一些略微复杂的功能。特别是,当你使用它与可变值(例如表)一起使用时,它可以像你预期的那样同时创建项目并将其赋值给键。

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
2013-11-05 15:52:24