Lua中如何为string表添加方法并修改self实现字符串消耗读取
问题原因
你的代码无法实现预期效果的核心原因有两个:
- Lua中的字符串是不可变类型,所有字符串操作(比如
sub)都会生成新的字符串,不可能修改原字符串本身。 - Lua的函数参数采用值传递,你在函数内修改的
str只是外部foo变量的拷贝,这个修改仅在函数作用域内生效,完全不会影响外部的foo变量。
另外你代码中的to_return没有加local修饰,会被默认声明为全局变量,存在污染全局环境的问题。
实现方案
要模拟Python io.StringIO 可读取、可消耗内容的行为,有两种常用实现方式:
方案1:封装StringIO类(和Python行为对齐,更规范)
通过表封装剩余字符串和操作方法,是最贴合需求的实现:
local StringIO = {} StringIO.__index = StringIO -- 构造方法,传入初始字符串 function StringIO.new(init_str) local self = setmetatable({}, StringIO) self._content = init_str or "" return self end -- 实现read方法,n不传默认读取全部剩余内容 function StringIO:read(n) n = n or #self._content local ret = self._content:sub(1, n) self._content = self._content:sub(n + 1) return ret end -- 示例用法 local foo = StringIO.new("heyfoobarhello") print(foo:read(3)) -- 输出 hey print(foo._content) -- 输出 foobarhello
方案2:多返回值手动赋值(轻量无封装)
如果不想额外封装类,可以让read方法同时返回读取结果和剩余字符串,外部手动更新原变量:
function string.read(str, n) local to_return = str:sub(1, n) local remaining = str:sub(n + 1) return to_return, remaining end -- 示例用法 local foo = "heyfoobarhello" local read_part read_part, foo = string.read(foo, 3) print(read_part) -- 输出 hey print(foo) -- 输出 foobarhello
内容的提问来源于stack exchange,提问作者NicoAdrian
相关产品推荐
相关产品推荐

