迭代 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) doi在各自的循环周期中是"test1""test2""test3"。所以 tests[i]() 解析为 tests["test1"]() 等等,即 tests.test1()

确保您了解 tests.itests["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