表达式作为语句 |
|
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
repeat until nsfm:fileExistsAtPath(testfile) or Shriek "File doesn't exist"
Perl 式语法可以在 Metalua 中添加 - 请参阅 MetaLuaRecipes 中的“表达式作为语句”
-{ extension 'expressionstatements' } f() or error 'failed!'