表达式作为语句

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 中的“表达式作为语句”

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

另请参阅


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2009 年 3 月 19 日下午 1:25 GMT (差异)