6

lua中是否有更易读的方式来编写:

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

我从不使用 k,所以我想把它从循环控制中取出,所以很明显我只是在迭代这些值。有没有像pairs() 这样的函数只给我一个值列表?

4

5 回答 5

10

没有仅迭代值的标准函数,但如果您愿意,可以自己编写。这是这样一个迭代器:

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

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

于 2012-09-12T21:03:48.867 回答
5

我见过人们使用_变量而不是 k 或 i。

于 2012-09-12T19:26:48.463 回答
1

如果您不想要您正在枚举的表的键/值对,为什么要使用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-13T01:57:00.577 回答
0

这是你的编码风格,真的。如果您可以阅读它并且与它保持一致,那么这无关紧要。

但是,我倾向于使用: for i,c in “i”代表“index”,“c”代表“child”,但“v”代表“value”也可以。即使您不使用索引变量,这仍然是一种很好的做法。

您可能会做的另一件事是: for n = 1, 10 处理数字时。但再一次,这是你的编码风格,只要它是一致的,你就应该是好的。

于 2012-09-12T23:43:28.313 回答
0

来自Lua 风格指南

The variable consisting of only an underscore "_" is commonly used as a placeholder when you want to ignore the variable:

for _,v in ipairs(t) do print(v) end
Note: This resembles the use of "_" in Haskell, Erlang, Ocaml, and Prolog languages, where "_" takes the special meaning of anonymous (ignored) variables in pattern matches. In Lua, "_" is only a convention with no inherent special meaning though. Semantic editors that normally flag unused variables may avoid doing so for variables named "_" (e.g. LuaInspect is such a case).

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

于 2013-02-19T09:52:16.047 回答