function - todos - Lua ¿Cómo crear una función personalizada que se pueda usar en variables?
funciones personalizadas en excel pdf (1)
Según su descripción, parece que busca algo similar a esta sintaxis:
local lines = readFile(file)
lines:readArgs(1) -- parse first line {"this", "is", "some", "input"}
Metatables puede ayudar con esto:
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
Tendrá que hacer un pequeño cambio en su readFile
y adjuntar ese metatabla a las lines
que está devolviendo:
function readFile(file)
-- ...
return setmetatable(lines, mt)
end
Editar : para responder el comentario de OP, una llamada como esta:
lines:readArgs(1)
es solo azúcar sintáctica para:
lines.readArgs(lines, 1)
Cuando la máquina virtual lua ejecuta la línea anterior, sucede lo siguiente:
- ¿Las
lines
la mesa tienen una clavereadArgs
? - En caso afirmativo, utilice su valor correspondiente, como es habitual para la parte restante de la declaración.
- Si no, ¿las
lines
tienen un índice metatable .__? En este caso, sí, por lo que se utiliza la función asignada a__index.readArgs
. -
readArgs
ahora se llama con los parámetros anteriores:self
= lines,linenum
= 1
Aquí no hay nada especial, es solo un parámetro regular; puedes ponerle el nombre que quieras realmente.
Con métodos como io.close (), puede usarlo así:
file:close()
¿Hay alguna manera de crear una función personalizada que funcione de esa manera, donde pueda llamarla a una variable?
Para mí, estoy tratando de usarlo para separar argumentos de un archivo de texto usando string.find para buscar espacios
Entonces en el archivo de texto parece
this is some input
Y la función readArgs () debería devolver toda la línea en una tabla con args [1] = "So", args [2] = "in", args [3] = "the" etc. después de ser llamado en la línea
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