迭代 table 并调用 lua 中的方法
Iterating over a table and calling a method in lua
我正在尝试迭代 table 个函数,并逐个调用每个函数。
我一直在尝试访问 field/method NIL 值。
其中一些是显而易见的,但其中一些让我感到困惑。
tests={}
function tests.test1()
print("test1 running\n")
end
function tests.test2()
print("test2 running\n")
end
function tests.test3()
print("test3 running\n")
end
print(tests)
-- why is tests.i() or tests:i not working?
for i,x in pairs(tests) do
print("x is")
print(x)
print("i is")
print(i)
--tests.i() -- attempt to call field i a NIL value
--tests.i(tests) -- ditto
--tests:i() -- attempt to call method i, a NIl value
--tests:i(tests) -- ditto
tests[i]() -- works!
--tests.x() -- attempt to call field x, a NIl value
--tests.x(tests) -- ditto
--tests:x() -- attempt to call method x, a NIL value
--tests[x]() -- attempt to call field ? a NIl value
end
--all these work
tests.test1(tests)
tests:test1()
tests.test2(tests)
tests:test2()
tests.test3(tests)
tests:test3()
为什么 tests.i() 方法不起作用,或者 tests.i(测试),如果它期待 'self' 参数,在这种情况下为什么 tests:i() 工作?
最后一位显示在循环外调用时它们都有效,这使得它更难理解。
tests.i()
是 tests["i"]()
的语法糖。 tests:i()
是 tests["i"](tests)
.
的语法糖
在你的循环中? for i, x in pairs(tests) do
、i
在各自的循环周期中是"test1"
、"test2"
、"test3"
。所以 tests[i]()
解析为 tests["test1"]()
等等,即 tests.test1()
确保您了解 tests.i
是 tests["i"]
的缩写,而不是 tests[i]
!因此,在一种情况下,您使用字符串 "i"
对 tests
进行索引,而在第二种情况下,您将使用变量 i
的值对其进行索引,在您的情况下,它是的键之一tests
.
在像你这样的循环中,值是函数,所以你可以简单地调用 x
而不是调用 tests[i]
顺便说一句。
调用 tests:test1()
时插入的参数将被丢弃,除非您为其指定占位符。
tests = {}
function tests.test1( a ) -- you can only use args you've accounted for
local a = a or ''
print( 'test1 running', a )
end
您也可以调用 x()
从循环中执行这些函数。
-- test i, test i. 1, 2, 3?
for i, x in pairs( tests ) do
print( string.format('i is "%s"', i ) )
print( 'x is', x )
x() -- same as calling tests["i"]()
end
tests:test1()
i is "test1"
x is function: 0x1420f20
test1 running
test1 running table: 0x1421f10
我正在尝试迭代 table 个函数,并逐个调用每个函数。 我一直在尝试访问 field/method NIL 值。 其中一些是显而易见的,但其中一些让我感到困惑。
tests={}
function tests.test1()
print("test1 running\n")
end
function tests.test2()
print("test2 running\n")
end
function tests.test3()
print("test3 running\n")
end
print(tests)
-- why is tests.i() or tests:i not working?
for i,x in pairs(tests) do
print("x is")
print(x)
print("i is")
print(i)
--tests.i() -- attempt to call field i a NIL value
--tests.i(tests) -- ditto
--tests:i() -- attempt to call method i, a NIl value
--tests:i(tests) -- ditto
tests[i]() -- works!
--tests.x() -- attempt to call field x, a NIl value
--tests.x(tests) -- ditto
--tests:x() -- attempt to call method x, a NIL value
--tests[x]() -- attempt to call field ? a NIl value
end
--all these work
tests.test1(tests)
tests:test1()
tests.test2(tests)
tests:test2()
tests.test3(tests)
tests:test3()
为什么 tests.i() 方法不起作用,或者 tests.i(测试),如果它期待 'self' 参数,在这种情况下为什么 tests:i() 工作? 最后一位显示在循环外调用时它们都有效,这使得它更难理解。
tests.i()
是 tests["i"]()
的语法糖。 tests:i()
是 tests["i"](tests)
.
在你的循环中? for i, x in pairs(tests) do
、i
在各自的循环周期中是"test1"
、"test2"
、"test3"
。所以 tests[i]()
解析为 tests["test1"]()
等等,即 tests.test1()
确保您了解 tests.i
是 tests["i"]
的缩写,而不是 tests[i]
!因此,在一种情况下,您使用字符串 "i"
对 tests
进行索引,而在第二种情况下,您将使用变量 i
的值对其进行索引,在您的情况下,它是的键之一tests
.
在像你这样的循环中,值是函数,所以你可以简单地调用 x
而不是调用 tests[i]
顺便说一句。
调用 tests:test1()
时插入的参数将被丢弃,除非您为其指定占位符。
tests = {}
function tests.test1( a ) -- you can only use args you've accounted for
local a = a or ''
print( 'test1 running', a )
end
您也可以调用 x()
从循环中执行这些函数。
-- test i, test i. 1, 2, 3?
for i, x in pairs( tests ) do
print( string.format('i is "%s"', i ) )
print( 'x is', x )
x() -- same as calling tests["i"]()
end
tests:test1()
i is "test1"
x is function: 0x1420f20
test1 running
test1 running table: 0x1421f10