表達式當作陳述式 |
|
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!'