gpt4 book ai didi

javascript - 在 Ruby 中重写 JavaScript break-to-label

转载 作者:数据小太阳 更新时间:2023-10-29 07:33:01 28 4
gpt4 key购买 nike

我正在移植 a JavaScript library到 Ruby,并遇到以下疯狂(严重缩写):

function foo(){
if (foo) ...
loop:
while(go()){
if (...) break;
switch(...){
case a:
break loop;
case b:
case c:
if (...) break loop;
...
break;
case d:
if (...) break loop;
// fall through
case e:
if (...) break loop;
...
break;
case f:
if (...) break loop;
object_init:
do{
switch(...){
case a:
...
break;
case b:
...
break object_init;
}
} while(...);
...
break;
}
}
}

(你可以查看完整的恐怖 on lines 701-1006 。)

您将如何用 Ruby 重写它?具体来说:

  • 处理混合的 breakbreak loop,以及
  • 处理交换机中偶尔发生的“掉线”

大概一个好的通用策略将帮助我度过其他情况,例如嵌套的 object_init 中断也会发生。

编辑:我真傻;像这样的 JavaScript“失败”:

switch(xxx){
case a:
aaa;
case b:
bbb;
break;
}

可以很容易地用 Ruby 重写为:

case xxx
when a, b
if a===xxx
aaa
end
bbb
end

最佳答案

有多种技术可以解决这个问题。

  1. 我相信您已经想到了这一点,但为了记录在案,您可以从噩梦函数中提取方法,直到它的结构看起来更合理为止。

  2. 您可以使用 lambda 定义外部循环,然后立即在下一行调用它们。这将允许您将 return 语句用作多级 break,并且创建的闭包将允许您仍然访问外部作用域变量。

  3. 您可以引发异常并挽救它。

  4. (由 Phrogz 添加) 正如@jleedev 链接的答案中所建议的,您可以使用 throw/catch,例如

    catch(:loop) do
    case ...
    when a
    throw :loop
    when b, c
    throw :loop if ...
    ...
    end
    end

关于javascript - 在 Ruby 中重写 JavaScript break-to-label,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4988045/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com