如果我不使用k,在Lua中是否有更易读的方法来编写for k,v in pairs(my_table)do ... end?

有没有一种在 Lua 中更易读的方式来编写以下代码:

for k, v in pairs(my_table) do
    myfunction( v )
end

我从未使用过 k,所以我想将其从循环控制中删除,以便清楚地表明我只是在迭代值。是否有像 pairs() 这样只提供值列表的函数?

点赞
用户1276964
用户1276964

我看到过有人使用 _ 变量来代替 k 或者 i

2012-09-12 19:26:48
用户1008957
用户1008957

没有标准函数专门迭代值,但是如果你希望的话,你可以自己编写。这是一个这样的迭代器:

function values(t)
  local k, v
  return function()
    k, v = next(t, k)
    return v
  end
end

但通常人们只使用pairs并丢弃第一个变量。在这种情况下,习惯上将未使用的变量命名为_(下划线)以明确表明意图。

2012-09-12 21:03:48
用户1542101
用户1542101

这真的取决于你的编程风格。如果你能理解它并且保持一致,那就无关紧要。

然而,我倾向于使用: for i,c in “i”代表“index”,“c”代表“child”,但“v”代表“value”也可以。即使你不使用索引变量,这仍然是一个好的习惯。

另一件你可能会做的事情是: for n = 1, 10 当处理数字时。但再次强调,这是你的编程风格,只要保持一致,你就可以做得很好。

2012-09-12 23:43:28
用户1208078
用户1208078

如果你不想要枚举表中的键/值对,那么为什么要使用pairs()函数呢?

例如,你可以更短地输入以下内容:

local t = {"asdf", "sdfg", "dfgh"}

for i=1, #t do
    print(t[i])
end

否则,我通常会这样做:

local t = {"asdf", "sdfg", "dfgh"}

for _,v in pairs(t) do
    print(v)
end

编辑:对于你的情况,你想枚举只有非数字键的表的值,可能最清晰的方法是编写自己的表迭代器函数,如此:

local t = {["asdf"] = 1, ["sdfg"] = 2, ["dfgh"] = 3}

function values(tbl)
    local key = nil
    return function()
            key = next(tbl, key)
            return tbl[key]
           end
end

for value in values(t) do
    print(value)
end

这样,你很明确地表明你只遍历表t中的值。像pairs()一样,这不保证按顺序遍历,因为它使用next()。

2012-09-13 01:57:00
用户72178
用户72178

Lua风格指南

当您想忽略变量时,只由下划线“_”组成的变量通常用作占位符:

for _,v in ipairs(t) do print(v) end
注意:这类似于Haskell,Erlang,Ocaml和Prolog语言中使用下划线“_”的用法,其中“_”在模式匹配中表示匿名(被忽略的)变量。在Lua中,“_”只是一种惯例,没有固有的特殊含义。通常标记为未使用变量的语义编辑器可能会避免对命名为“_”的变量进行标记(例如,LuaInspect就是这种情况)。

因此,我希望对于未使用的变量使用下划线(_)名称会更具可读性。

2013-02-19 09:52:16