Simple LZW 压缩无法正常工作

我编写了一个简单的类来压缩数据。它如下所示:

LZWCompressor = {}
function LZWCompressor.new()
  local self = {}
  self.mDictionary = {}
  self.mDictionaryLen = 0
  -- ...
  self.Encode = function(sInput)
    self:InitDictionary(true)
    local s = ""
    local ch = ""
    local len = string.len(sInput)
    local result = {}
    local dic = self.mDictionary
    local temp = 0
    for i = 1, len do
        ch = string.sub(sInput, i, i)
        temp = s..ch
        if dic[temp] then
            s = temp
        else
            result[#result + 1] = dic[s]
            self.mDictionaryLen = self.mDictionaryLen + 1
            dic[temp] = self.mDictionaryLen
            s = ch
        end
    end
    result[#result + 1] = dic[s]
    return result
  end
  -- ...
  return self
end

我通过以下方式运行它:

local compressor = LZWCompression.new()
local encodedData = compressor:Encode("我喜欢 LZW,但它不想压缩这段文本。")

print("输入长度:",string.len(originalString))
print("输出长度:",#encodedData)

local decodedString = compressor:Decode(encodedData)
print(decodedString)
print(originalString == decodedString)

但是当我最终执行它时,它显示解释器期望字符串,而不是**Table **。这是奇怪的事情,因为我传递了类型为字符串的参数。为了测试 Lua 的日志,我在函数的开头写了以下内容:

print(typeof(sInput))

我得到的输出是“Table”和 Lua 的错误。那么如何修复它?为什么 Lua 显示传递的字符串为表格?我使用的是 Lua 5.3。

点赞
用户5675002
用户5675002

问题在于 Encode() 方法的定义上,并且很可能 Decode() 也有同样问题。

你使用了点号语法来创建 Encode() 方法:self.Encode = function(sInput)

但是你却使用冒号语法来调用它:compressor:Encode(data)

当你使用冒号语法来调用 Encode() 方法时,它的第一个隐式参数会是 compressor 本身(来自于你的错误信息中的表),而不是数据。

为了修复它,你需要使用冒号语法来声明 Encode() 方法:function self:Encode(sInput),或者显式地将 'self' 作为第一个参数添加进去:self.Encode = function(self, sInput)

2016-05-10 08:55:39
用户2858170
用户2858170

你提供的代码根本无法运行。

你定义了 function LZWCompressor.new() 但是调用了 CLZWCompression.new()

Encode 函数中,你调用了 self:InitDictionary(true),但这个函数并没有被定义。

可能你没有将所有相关的代码都粘贴在这里。

你得到错误的原因是你调用了 compressor:Encode(sInput),它等价于 compressor.Encode(self, sInput) (语法糖)。由于函数参数不是通过名称而是通过位置传递的,因此 Encode 函数中的 sInput 现在是 compressor 而不是你的字符串。你的第一个参数(恰好是 self,一张表)然后传递给了 string.len,它期望一个字符串。因此你实际上调用了 string.len(compressor),这当然会导致错误。

请确保你知道如何调用和定义函数以及如何正确使用 self!

2016-05-10 09:36:32