Lua 提供 loadstring (5.1) / load (5.2+) 將字串編譯為函數,類似 JavaScript eval 但更安全(回傳函數而非直接執行)。本文示範動態計算數學運算式與定義可呼叫函數兩種用法。
local param = "7*100"
local func = loadstring("return " .. param) -- 加上 return 取得結果
local result = func()
print(result) -- 700
-- 直接執行
loadstring("print('test')")()
-- 定義函數變數
local funcStr = "print('hello from string')"
local func = loadstring(funcStr)
func() -- 輸出: hello from string
為安全起見,可設定環境表限制可用全域變數:
local sandbox = {
print = print,
math = {abs=math.abs, sqrt=math.sqrt},
_G = sandbox -- 防止存取真實 _G
}
local func = loadstring(untrusted_code)
setfenv(func, sandbox) -- Lua 5.1
-- Lua 5.2+: load(untrusted_code, nil, 't', sandbox)
func()
loadstring 編譯失敗回傳 nil, error_msg,需檢查錯誤。loadstring,改用 load。善用 loadstring 可構建高度動態的 Lua 應用架構。