在Lua中,只有一个参数的if语句是什么意思?

我被教授用Java编程。Lua对我来说是新的,我试图做我的功课,但不确定下面这个if语句是什么意思。

代码如下:

local function getMinHeight(self)
    local minHeight = 0
    for i=1, minimizedLines do
        local line = select(9+i, self:GetRegions())
        **if(line) then
            minHeight = minHeight + line:GetHeight() + 2.5
        end**
    end
    if(minHeight == 0) then
        minHeight = select(2, self:GetFont()) + 2.5
    end
    return minHeight
end

在**之前和之后的if语句是我不确定的部分。我不知道这个if语句在检查什么。如果这行不是nil?如果这行存在?如果是什么?

点赞
用户501459
用户501459

在 Lua 中,任何不是 nilfalse 的值在条件语句中都被视为 true。

如果这一行不是 nil?这一行是否存在?

两者都是,因为它们有点相同的意思。

select 函数从它的参数列表中返回一个特定的参数。它主要与 ... 一起使用,但在这种情况下,它用于选择 self:GetRegions 返回的第 (i+9) 个值。如果没有这样的值(例如,如果 GetRegions 只返回 5 个值),则 select 返回 nil。

if(line) 检查是否从 select 中返回了一个值。

if(line) 被用作 if(line ~= nil) 的快捷方式,因为 nil 在条件语句中被视为 false。


需要指出的是,这种快捷方式并不总是适用的。例如,我们可以像这样迭代一个表中的所有值:

key, val = next(lookup)
while key do
    print(key, val)
    key, val = next(lookup, key)
end

但是,如果表的键之一是 false,这将会 _失败_:

lookup = {
    ["fred"] = "Fred Flinstone",
    [true] = "True",
    [false] = "False",
}

因此,我们必须显式地检查 nil

key, val = next(lookup)
while key ~= nil do
    print(key, val)
    key, val = next(lookup, key)
end
2012-05-24 15:40:48
用户312586
用户312586

正如Mud所说,Lua中除了nilfalse之外的任何内容都被认为是_truthy_(非假值)。因此,上面的if语句只要line不是nilfalse,就会通过。

也就是说,你提出的问题让我有点担心,因为这里的“一个参数的if语句”并不准确。

首先,它不叫“参数”,而是_expression_(表达式)。在大多数语言中,_expression_总是只有一个。例如在Java中,你可以这样做:

bool found = false

...

if(found) {
  ...
}

if语句只关心_expression_的最终值,不管是单个变量还是更复杂的结构。

2012-05-24 16:54:42