将方法添加到字符串并在 Lua 中修改自身

Add method to string and modify self in Lua

如何向 string table 添加方法并在其中修改 self ?

基本上,我试图模仿 python 中 io.StringIO.read 方法的行为,它读取字符串中的 n char 和 returns 它们,修改通过“消费”字符串。

我试过这个:

function string.read(str, n)
  to_return = str:sub(1, n)
  str = str:sub(n + 1)
  return to_return
end

local foo = "heyfoobarhello"
print(string.read(foo, 3))
print(foo)

输出为:

hey
heyfoobarhello

我预计第二行只有 foobarhello

我怎样才能做到这一点?

要模仿 Python 的 io.StringIO class,您必须创建一个对象来存储基础字符串和该字符串中的当前位置。从 IO 流读取通常不会修改底层数据。

local StringIO_mt = {
  read = function(self, n)
    n = n or #self.buffer - self.position + 1
    local result = self.buffer:sub(self.position, self.position + n - 1)
    self.position = self.position + n
    return result
  end,
}
StringIO_mt.__index = StringIO_mt

local function StringIO(buffer)
  local o = {buffer = buffer, position = 1}
  setmetatable(o, StringIO_mt)
  return o
end

local foo = StringIO"heyfoobarhello"
print(foo:read(3))
print(foo:read())

输出:

hey
foobarhello

我不建议将此 class 或方法添加到 Lua 的 string 库中,因为对象必须比字符串更复杂。

您可以独立于字符串 table.
向数据类型字符串添加方法 简短示例显示字符串方法即使在字符串 table 被删除时也能正常工作...

string=nil

return _VERSION:upper():sub(1,3)
-- Returning: LUA

所以你可以添加一个方法...

-- read.lua
local read = function(self, n1, n2)
return  self:sub(n1, n2)
end

getmetatable(_VERSION).__index.read=read

return read

...对于所有字符串。
(不仅是_VERSION)

并使用它...

do require('read') print(_VERSION:read(1,3):upper()) end
-- Print out: LUA