4

Lua 是一门轻巧而强大的语言,但有时感觉缺少一些我们在其他语言中习惯的非常方便的功能。我的问题是关于嵌套if条件。在 Perl、Python、C++ 中,我通常倾向于避免嵌套结构并尽可能编写纯代码,例如:

# Perl:
for (my $i = 0; $i < 10; ++$i) {
    next unless some_condition_1();
    next unless some_condition_2();
    next unless some_condition_3();
    ....
    the_core_logic_goes_here();        
}

Lua 缺少那个nextorcontinue语句,所以相同的代码看起来像:

-- Lua:
for i = 1, 5 do
    if some_condition_1() then
        if some_condition_2() then
            if some_condition_3() then
                the_core_logic_goes_here()
            end
        end
    end
end

所以我想知道是否有标准方法可以避免ifLua 中的嵌套块?

4

5 回答 5

6

在 Lua 5.2 上,您可以使用goto语句(请小心)!

该关键字的典型用法之一是替换缺失的continueornext语句。

for i = 1, 5 do
  if not some_condition_1() then goto continue end
  if not some_condition_2() then goto continue end
  if not some_condition_3() then goto continue end
  the_core_logic_goes_here()
::continue::
end
于 2012-09-12T11:22:27.687 回答
5

我不知道这是否特别惯用,但您可以使用单个嵌套循环break来模拟continue

for i = 1, 5 do
    repeat
        if some_condition_1() then break end
        if some_condition_2() then break end
        if some_condition_3() then break end
        the_core_logic_goes_here()
    until true
end
于 2012-09-12T10:49:28.003 回答
4

有时感觉缺少一些我们在其他语言中习惯的非常方便的功能

权衡是概念的经济性,这导致了实现的简单性,这反过来又导致了 Lua 著名的速度和体积小。

至于您的代码,这不是最广泛的解决方案(请参阅其他受访者了解实现 continue 的两种方式),但对于您的特定代码,我只需编写:

for i = 1, 5 do
    if  some_condition_1() 
    and some_condition_2() 
    and some_condition_3() then
        the_core_logic_goes_here()
    end
end
于 2012-09-12T16:00:05.947 回答
0
for v in pairs{condition1,condition2,condition3} do
    if  v() then
        the_core_logic_goes_here()
    end
end

可能是你喜欢的?

“Lua 缺少下一个或继续语句” Lua 作为下一个语句和一个非常相似的函数“ipairs”。

于 2012-09-12T23:59:09.747 回答
0

解决方案 1。

您可以将所有条件添加到 if 语句并使用 else 语句,您应该这样做。所以是这样的:

if cond_1() and cond_2() and cond_n() then
  the_core_logic_goes_here()
else
  -- do something else here
end

解决方案 2。

您可以使用类似但看起来更像其他语言的东西,您更喜欢使用这种语言,如果不满足if cond_n() then else return end,则只返回 nil 。cond_n()总而言之,它应该看起来像这样:

for idx=1, 5 do
  if cond_1() then else return end
  if cond_2() then else return end
  if cond_3() then else return end
  if cond_4() then else return end
  the_core_logic_goes_here()
end

但是,我真的认为你应该使用前者,它是一个更好的解决方案,我很确定 lua 解决方案 1. 将编译成更快的字节码。

于 2016-08-06T22:47:05.577 回答