将方法添加到字符串并在 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
如何向 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