首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这段lua代码来自伟大的wm做什么?

这段lua代码来自伟大的wm做什么?
EN

Stack Overflow用户
提问于 2018-12-26 13:56:56
回答 2查看 537关注 0票数 2

看看下面的代码:

代码语言:javascript
复制
local urgent = {}

local capi =
{
    client = client,
}

local client
do
    client = setmetatable({}, {
        __index = function(_, k)
            client = require("awful.client")
            return client[k]
        end,
        __newindex = error -- Just to be sure in case anything ever does this
    })
end

我很难理解它的作用。它来自awesome-wm项目。这些是我很难理解的事情:

  1. client = clientcapi声明中的应用
  2. setmetatabledo-end中的东西
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-26 17:34:47

  1. client = clientcapi声明中的应用

这定义了capi在该文件的作用域中可用的部分,如果您查看client.lua文件,就会发现其中定义的capi具有客户端、鼠标、屏幕和令人敬畏的功能。

对于capi表中定义的每一项,都有一个相应的.c文件。这些文件定义了对象,如clienturgent.lua具有该对象的可见性,很可能它是一个全局变量,这就是如何设置client = client --第二个客户端引用全局变量。

下面是两个文件的示例:

main.lua

代码语言:javascript
复制
bar = "Hello World!"

local foo = require('foo')

print(foo.bar)

foo.lua

代码语言:javascript
复制
local foo = {
    bar = bar
}
return foo

main.lua中的打印函数将导致Hello World!

  1. setmetatabledo-end中的东西

在这里,通过将setmetatable扭曲在一个do块中,代码将在一个受限的范围内执行。这通常是为了包含块的局部变量,以便它们在代码执行后不会持久。

这就是说,这不是这个块的目的,因为这个块没有局部变量。在我看来,阻塞只是显示被修改的对象是客户端的局部变量,而不是客户机的全局变量。

此外,这里的元可用于防止循环依赖循环,在项目中出现类似代码的一些地方提到了注释,例如定义了client.lualocal screen

票数 4
EN

Stack Overflow用户

发布于 2018-12-26 19:18:43

@Nifim回答很好。我只想添加更多的上下文,说明为什么这段代码存在于正确的历史上下文中。在Lua 5.2之前,模块系统是不同的。在核心Lua库中定义了一个神奇的module()函数。创建模块时,在调用module()之前,必须首先生成所有全局变量的本地版本,否则它将在自己的全局环境中运行。"capi“表示"Core API”或"C (language) API“,视乎天气而定。如果今天用我们现在掌握的所有知识来编写Awesome,那么就不会有一个公开的"C语言“API,它们将永远隐藏在私有部分中,以增加灵活性。现在,设置"c.my_own_property“可以在capi.client和awful.client之间进行几次往返,以适应所有遗留约束。

现在,元魔法是一种叫做元延迟加载的Lua模式。因为urgentawful.client的一个子模块,所以它不能直接导入awful.client而不引起循环依赖。随着时间的推移,随着Awesome得到更好的定义,越来越多的人进行了重构,它们常常引入奇怪的依赖关系,以保持某种程度的向后兼容性。在最好的情况下,我们会忽略所有用户配置,只需重新设计整个代码,以避免这些循环依赖。然而,每次我们这样做时,所有上述API的用户都会在一天早上醒来,无法再登录到他们的计算机。因此,这种解决方法的存在是为了防止此类事件的发生,以换取一些奇怪的代码和维护负担。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53933064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档