使用像io.close()这样的方法,您可以像这样使用它:
file:close()
有没有办法创建一个像这样工作的自定义函数,你可以在变量上调用它?
对我来说,我试图通过使用string.find来查找空格来使用它来分隔文本文件中的参数
所以在文本文件中它看起来像
this is some input
并且readArgs()函数应该在一个表中返回整行,其中args [1] =“So”,args [2] =“in”,args [3] =“the”等。这条线
function readFile(file)
local lines = {}
assert(io.open(file), "Invalid or missing file")
local f = io.open(file)
for line in f:lines() do
lines[#lines+1] = line
end
return lines
end
function readArgs(line) -- This is the function. Preferably call it on the string line
--Some code here
end
答案 0 :(得分:3)
根据您的描述,听起来您正在使用类似于此语法的内容:
local lines = readFile(file)
lines:readArgs(1) -- parse first line {"this", "is", "some", "input"}
Metatables可以帮助解决这个问题:
local mt = { __index = {} }
function mt.__index.readArgs(self, linenum)
if not self[linenum] then return nil end
local args = {}
for each in self[linenum]:gmatch "[^ ]+" do
table.insert(args, each)
end
return args
end
您需要对readFile
进行细微更改,并将该元表附加到您要返回的lines
上:
function readFile(file)
-- ...
return setmetatable(lines, mt)
end
修改:要回答OP的评论,请拨打以下电话:
lines:readArgs(1)
只是语法糖:
lines.readArgs(lines, 1)
当lua VM执行上述行时,会发生以下情况:
lines
是否有readArgs
密钥?lines
是否有metatable .__索引?在这种情况下,它会使用分配给__index.readArgs
的函数。readArgs
:self
=行,linenum
= 1 这里self
没有什么特别之处,它只是一个常规参数;你可以把它命名为你想要的任何东西。