AwesomeWM:迭代器在客户端上迭代时不可调用(table 值)

AwesomeWM: for iterator is not callable (a table value) when iterating on clients

我试图在按下某些键时切换所有标题栏。为此,我想遍历所有客户端。我尝试了几种方法,包括:

for s in screen do
 for c in s.clients do
  awful.titlebar.toggle(c)
 end
end

for c in client.get() do
 awful.titlebar.toggle(c)
end

每次执行此代码时都会出现错误:for iterator 'for iterator' is not callable (a table value).

这对我来说毫无意义。你能解释一下为什么会这样以及如何解决我的问题吗?

我是 运行 很棒的 4.3 和 Lua 5.4.3。

此外,如果您有一种优雅的方式来切换标题栏,并且对新客户也有影响,我会接受。谢谢。

编辑:我想明确指出即使 for-loops

中没有 awful.titlebar.toggle(c) 也会发生错误

您使用的循环是通用的 for 循环。他们期望关键字 in 后的表达式列表。第一个必须是迭代器函数。

在您的代码中缺少此项。相反,有一个不可调用的 table.

来自Lua Reference Manual

A for statement like

 for var_1, ···, var_n in explist do body end works as follows.

The names var_i declare loop variables local to the loop body. The first of these variables is the control variable.

The loop starts by evaluating explist to produce four values: an iterator function, a state, an initial value for the control variable, and a closing value.

我不知道你的变量 screens.clientsclient.get 的 return 值,但由于错误是抱怨 table值你可能只是忘了用 table 作为参数调用 pairs

This makes no sense to me.

因为你不了解 Lua 的基础知识。阅读手册。你怎么能指望在不参考手册的情况下正确地使用一些复杂的东西作为通用的 for 循环?

@Piglet 的回答是正确的,但这是实际的“如何修复它”:

for index, c in ipairs(client.get()) do
    awful.titlebar.toggle(c)
end

这里的problem/confusion主要是历史。有人将 screen 变成了循环迭代器,因为他们认为这是一个很酷的节省时间的方法。

但是,它是整个 API 中唯一以这种方式工作的对象(不会有更多)。其他对象使用 module_name() 作为构造函数,而不是循环迭代器。在不破坏 API 的情况下这是无法修复的,因此它仍然存在。我们不能破坏我们记录的 API,因为它会在升级时破坏人们的配置。

AwesomeWM API 中的每个其他 table/list 都需要 ipairs()pairs() 进行迭代。 ipairs 用于有序 list/tables 而 pairs 用于字典。