表達式當作陳述式

lua-users home
wiki

在一些程式語言中,各種常見的慣用語法是由允許表達式當作陳述式而實現的。一個 Perl 的範例

f() or die("fail");   # short alternative to unless (f()) { die("fail"); }

在 Lua 中,這種寫法無法運作,因為表達式不能當作陳述式

f() or error("fail")  -- syntax error

Lua 選擇這種行為以避免程式語言中的歧義。

a = b - c
-- Could this be "a = b; -c;"?
a = b
-c
-- Could this be "a = b - c"?

儘管如此,在 Lua 中或許有一些方法可以達成類似的效果

-- method #1
local _ = f() or error("fail")

-- method #2
local function E() end
E(f() or error("fail"))

-- method #3
-- This is not much better than if not f() then error("fail") end
if f() or error("fail") then end

在方法 #1 中,結果指定給一個名為「_」的變數,這個變數並未被使用。「_」這個名稱對 Lua 沒有特別的意義,我們可以選擇任何其他名稱,但是當我們想要忽略一個值(如下方的範例)時,慣例上會使用 _,因此這個選擇具有語義意義。

for _,v in ipairs(t) do print(v) end

儘管這與我們想要的簡潔相違背,不過 local 關鍵字被加入以限制範圍並避免全域變數的副作用(在上述的 for 迴圈變數中,local 是隱含的)。

另一種可能性(--RiciLake)是

(f or Nil)()  -- similar to f and f() as well as if f then f() end

這是一個由 RiciLake 所提供的另一種偏門解決方法 [1]

repeat until nsfm:fileExistsAtPath(testfile)
   or Shriek "File doesn't exist"

類似的 Perl 語法可以在 Metalua 中加入--請參閱 MetaLuaRecipes 中的「Expressions as Statements」

-{ extension 'expressionstatements' }
f() or error 'failed!'

另請參閱


RecentChanges · 偏好設定
編輯 · 歷史
最後編輯時間為 2009 年 3 月 19 日下午 1:25 GMT (diff)