加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Lua中的“主要”功能?

发布时间:2020-12-15 00:22:00 所属栏目:大数据 来源:网络整理
导读:在python中,通常会定义一个主要功能,以便将脚本用作模块(如果需要): def main(): print("Hello world") return 0if __name__ == "__main__": sys.exit(main()) 在Lua中,如果__name__ ==“__main__”的成语是不可能的(这意味着我不认为是这样)。 这就是我
在python中,通常会定义一个主要功能,以便将脚本用作模块(如果需要):
def main():
    print("Hello world")
    return 0

if __name__ == "__main__":
    sys.exit(main())

在Lua中,如果__name__ ==“__main__”的成语是不可能的(这意味着我不认为是这样)。

这就是我通常在为了在Lua中有类似的行为而做的:

os.exit((function(args)
    print("Hello world")
    return 0
end)(arg))

但是这种方法似乎比较重“括号”:-)

有更常见的方法(除了定义一个全局主要功能,这似乎是多余的)?

解决方法

没有“适当”的方式来做,因为Lua并没有真正区分代码,它们只是功能。话虽如此,至少在Lua 5.1中似乎是有效的:
matthew@silver:~$ cat hybrid.lua 
if pcall(getfenv,4) then
    print("Library")
else
    print("Main file")
end
matthew@silver:~$ lua hybrid.lua 
Main file
matthew@silver:~$ lua -lhybrid
Library
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org,PUC-Rio
> ^C
matthew@silver:~$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org,PUC-Rio
> require "hybrid"
Library
> ^C
matthew@silver:~$

它通过检查堆栈深度是否大于3(库存Lua解释器中的文件的正常深度)起作用。这个测试可能会在Lua版本之间崩溃,甚至在任何嵌入式/定制的Lua版本中都会发生。

我也将包括这个(稍微更便携)的替代方案,尽管它在启发式方面取得了更大的飞跃,并且出现故障(见下文):

matthew@silver:~$ cat hybrid2.lua 
function is_main(_arg,...)
    local n_arg = _arg and #_arg or 0;
    if n_arg == select("#",...) then
        for i=1,n_arg do
            if _arg[i] ~= select(i,...) then
                print(_arg[i],"does not match",(select(i,...)))
                return false;
            end
        end
        return true;
    end
    return false;
end

if is_main(arg,...) then
    print("Main file");
else
    print("Library");
end
matthew@silver:~$ lua hybrid2.lua 
Main file
matthew@silver:~$ lua -lhybrid2
Library
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org,PUC-Rio
> ^C
matthew@silver:~$ lua 
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org,PUC-Rio
> require "hybrid2"
Library
>

这一个通过比较_G.arg的内容和’…’的内容来工作。在主要的方面,他们将永远是一样的。在_G.arg模块中,仍然包含命令行参数,但’…’将包含传递给require()的模块名称。我怀疑这更接近于您的更好的解决方案,因为您知道您的模块名称。此代码中的错误在用户使用1个参数执行主脚本时,这是您的模块的确切名称:

matthew@silver:~$ lua -i hybrid2.lua hybrid2
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org,PUC-Rio
Main file
> require "hybrid2"
Main file
>

鉴于上述,我希望至少你知道你站在哪里,即使这不是你所想的:)

更新:对于在Lua 5.1和5.2中工作的hybrid.lua版本,您可以使用debug.getlocal替换getfenv:

if pcall(debug.getlocal,4,1) then
    print("Library")
else
    print("Main file")
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读