2013-04-27 2 views

答えて

20

を実行しているかどうかを知りたいですルアのバージョン:

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

+3

@finnw - 'math.pi'でも意図的に' 3'に設定することができます:-) –

+0

'' Lua 5.2 ''には '_ENV'というグローバル変数もあるので、' 'Lua 5.2以上」を意味すると思います。 – JeromeJ

3

_VERSIONは、インタープリタのバージョンを保持します。参考のためにmanualを確認してください。

2

また、Luaバージョン(_VERSIONでは使用できません)の3桁目が必要な場合は、コマンドラインでlua -vコマンドの出力を解析する必要があります。

このスクリプトio.popenサポートしているプラ​​ットフォームは、トリックを行いますが、スクリプトは(ない対話モードでの)スタンドアロンのインタプリタによって実行されている場合のみのために

argグローバルテーブルを定義する必要があります.IOW:

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は(Linuxの場合、私は知りません)、Windows上stderrに書き込む注意ので、(のみstdoutキャプチャ)io.popenためcommandstdoutstderrをリダイレクトし、構文はプラットフォーム固有である必要があります。

+0

3桁目は、機能の変更なしにリリースを修正してください。それらをテストするのは意味がないようです。 – lhf

+0

@lhf一般的には私は完全に同意しますが、特別なニーズのためには知っておくと便利です。例えば。あなたのスクリプトが、特定のパッチが適用されているインタプリタによって実行されているのか、それとも古いものであるのかを発見したいとします(おそらく、あなたの制御下にないシステムでスクリプトを実行しなければならないかもしれません。コードを使用する必要があります)。しかし、私はそれがニンピッカ側のビットであることを認めています:-) –

+0

Linuxでは 'lua -v'はLua 5.2では' stdout'に書き込みますが、Lua 5.1では 'stderr'に書き込みますが、リダイレクトの構文は(Bourne)シェルでも同じですが、LinuxとWindowsで同じコマンド文字列を使うことができます(OS Xでもほとんど同じです)。 –

関連する問題