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

使用像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),“无效或缺少文件”)     local f = io.open(file)     for line in f:lines()do         lines [#lines + 1] = line     end     返回行 end

function readArgs(line) - 这是函数。最好在字符串线上调用它     -一些代码 结束

点赞
用户234175
用户234175

根据您的描述,您似乎想要类似于以下语法:

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

您将需要稍微更改readFile并将元表附加到您返回的lines上:

function readFile(file)
  -- ...
  return setmetatable(lines, mt)
end

编辑:回答OP的评论,像这样的调用:

lines:readArgs(1)

只是下面语句的语法糖:

lines.readArgs(lines, 1)

当lua VM执行上面的行时,下面发生的事情:

  • 表格lines是否具有readArgs键?
  • 如果是,则按照惯例使用相应的值进行剩余部分的语句。
  • 如果没有,则lines具有元表.__index?在这种情况下,将使用分配给__index.readArgs的函数。
  • readArgs现在以上面的参数调用:self = lines,linenum = 1

这里没有什么特殊的self,它只是一个常规参数;你可以随便给它命名。

2014-12-07 08:28:38