2013-04-27 73 views

回答

20

有全局变量_VERSION(字符串):

print(_VERSION) 

-- Output 
Lua 5.2 

UPD:
其他方法区别开来Lua版本:

if _ENV then 
    -- Lua 5.2 
else 
    -- Lua 5.1 
end 

if 9^33 == 27^22 then -- this check is valid for x86/x64 only 
    -- vanilla Lua 
else 
    -- LuaJIT 
end 
+1

小心 - '_ENV'可以有意设置为'nil'。 – finnw 2013-04-28 00:02:51

+3

@finnw - 即使'math.pi'可以有意设置为'3' :-) – 2013-04-28 06:19:29

+0

我认为你的意思是'Lua 5.2或更高版本',因为'Lua 5.3'也有'_ENV'全局变量。 – JeromeJ 2016-01-17 04:22:18

3

_VERSION包含解释器版本。检查manual以供参考。

2

如果您还需要Lua版本中的第三个数字(在_VERSION中不可用),则需要在命令行上解析命令lua -v的输出。

对于支持io.popen这个脚本会做的伎俩平台,但前提是脚本由独立的解释(不是在交互模式).IOW必须定义arg全局表运行:

local i_min = 0 
while arg[ i_min ] do i_min = i_min - 1 end 
local lua_exe = arg[ i_min + 1 ] 

local command = lua_exe .. [[ -v 2>&1]] -- Windows-specific 
local fh = assert(io.popen(command)) 
local version = fh:read '*a' 
fh:close() 

-- use version in the code below 

print(version) 
print(version:match '(%d%.%d%.%d)') 

注意lua -v写在stderr在Windows(对于Linux,我不知道),所以command为io.popen(只捕获stdout)必须重定向到stderrstdout的语法是特定于平台。

+0

第三位数字表示不同的bug-修复版本而不改变功能。测试这些似乎毫无意义。 – lhf 2013-08-19 00:32:18

+0

@lhf在一般情况下,我完全同意,但对于特殊需要,这是一个有用的技巧。例如。假设你想要发现你的脚本是由一个应用了特定补丁的解释程序运行的,还是一个较旧的脚本(也许你必须在一个不受你控制的系统上运行脚本,所以你不知道在该代码必须使用或不)。但我承认它在nitpicker方面有点:-) – 2013-08-19 00:43:01

+0

在Linux上''lua -v''使用Lua 5.2写入'stdout',但使用Lua 5.1写入'stderr',但由于重定向的语法是在(Bourne)shell中相同,您可以在Linux和Windows上使用相同的命令字符串(并且几乎可以肯定在OS X上)。 – 2014-09-27 14:33:45

相关问题