AwesomeWM:在迭代客户端时出现 for iterator is not callable(一个表值)错误

我正在尝试在按下某些键时切换所有标题栏。为此,我想要迭代所有客户端。我尝试了多种方式,包括:

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)

这对我来说毫无意义。你能解释为什么会发生这种情况以及如何解决我的问题吗?

我正在运行搭载 Lua 5.4.3 的 Awesome 4.3。

另外,如果你有一种优雅的方法可以切换标题栏并影响新的客户端,我会感激不尽。谢谢。

编辑:我想澄清一下,即使在 for 循环中没有 awful.titlebar.toggle(c),错误也会发生。

原文链接 https://stackoverflow.com/questions/70609017

点赞
stackoverflow用户2858170
stackoverflow用户2858170

你所使用的循环是通用的 for 循环。在关键词 in 后面,它们期望一个表达式列表。第一个表达式必须是一个迭代器函数。

在你的代码中缺少这个函数。而是有一个不可调用的表。

根据 Lua 参考手册

如下形式的 for 语句:

for var_1, ···, var_n in explist do body end

它的运行方式如下。

变量名称 var_i 声明为循环体内的局部变量。第一个变量是控制变量。

循环开始时,通过计算 explist 来产生四个值:一个迭代器函数、一个状态、控制变量的初始值和一个终止值。

我不知道你的变量 screen, s.clients 以及 client.get 的返回值,但是由于错误提示是关于一个表格(table)的值,你很可能只是忘了用这个表格作为参数调用 pairs 函数。

我觉得这没有意义。

因为你不知道 Lua 的基础知识。请阅读手册。你如何能够不参考手册就正确地使用像通用 for 循环这样的复杂东西呢?

2022-01-06 22:23:46
stackoverflow用户1672598
stackoverflow用户1672598

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

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

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

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

AwesomeWM API 中的每个其他表/列表都需要使用 ipairs()pairs() 进行迭代。ipairs 用于有序列表/表格,而 pairs 用于字典。

2022-01-07 10:39:56