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

时间:2014-12-07 07:42:00

标签: function variables 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), "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

1 个答案:

答案 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的函数。
  • 现在使用上述参数调用
  • readArgsself =行,linenum = 1

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