Function Lua如何创建可用于变量的自定义函数?

Function Lua如何创建可用于变量的自定义函数?,function,variables,lua,Function,Variables,Lua,对于io.close()等方法,您可以这样使用它: file:close() lines:readArgs(1) 有没有一种方法可以创建一个这样工作的自定义函数,您可以在变量上调用它 对我来说,我试图使用string.find来查找空格,从而将参数与文本文件分开 所以在文本文件中 this is some input 并且readArgs()函数在一行上被调用后,应返回表中args[1]=“So”、args[2]=“in”、args[3]=“the”等的整行 function readFi

对于io.close()等方法,您可以这样使用它:

file:close()
lines:readArgs(1)
有没有一种方法可以创建一个这样工作的自定义函数,您可以在变量上调用它

对我来说,我试图使用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

根据您的描述,听起来您在追求类似于以下语法的东西:

local lines = readFile(file)
lines:readArgs(1) -- parse first line {"this", "is", "some", "input"}
元表可以帮助实现这一点:

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
您必须在
读取文件中稍作更改,并将该元表附加到要返回的
行中:

function readFile(file)
  -- ...
  return setmetatable(lines, mt)
end
编辑:要回答OP的评论,请拨打以下电话:

file:close()
lines:readArgs(1)
只是语法糖:

lines.readArgs(lines, 1)
当lua VM执行上述行时,会发生以下情况:

  • 是否有
    readArgs
  • 如果是,则对语句的其余部分使用其相应的值
  • 如果否,
    是否有元表。\u索引?在本例中是这样的,因此使用分配给
    \u index.readArgs
    的函数
  • readArgs
    现在使用上面的参数调用:
    self
    =lines,
    linenum
    =1

这里的
self
没有什么特别之处,它只是一个常规参数;你可以给它起任何你想要的名字。

所以,为了澄清,你要做的是能够调用
someStringVariable:readArgs()
?是的。可能会调用string:readArgs()之类的函数,然后让它返回一个参数表或一些术语:函数将值作为参数;不是变量。
的LHS是一个表达式。这里使用的self参数代表什么?桌子被叫来了?我测试了您用我的语法提供的代码,它工作得很好,但我希望能够更好地理解这段代码,我已经添加了一些解释。看看这是否有帮助。为了澄清,因为Lua找不到行[“readArgs”],所以它在元表中查找了uu索引[“readArgs”]?正确,如果您在不存在的表中查询键,Lua将作为回退查询元表。如果没有与该表关联的元表,那么您只需要像往常一样得到
nil