gpt4 book ai didi

ruby - 一条 "&&"语句可以处理多少个 "if"?

转载 作者:数据小太阳 更新时间:2023-10-29 08:14:53 25 4
gpt4 key购买 nike

我有以下代码:

if @if_tannin_true && @if_acid_true && @if_alcohol_true && @if_body_true #I would like to add this: && @if_fruit_true #&& @if_fruit_character_true && @if_non_fruit_true && @if_organic_earth_true && @if_inorganic_earth_true && @if_wood_true

y = 0
while y < @grapes[i].testables.count
@result << @grapes[i].testables[y].name
y+=1
end
end

我意识到使用四个“&&”的 if 语句工作正常,但使用第五个则不行。我该如何处理?


编辑:现在有效。我刚刚重新启动了服务器。很高兴知道我们可以根据需要使用尽可能多的“&&”。

最佳答案

有趣的问题!

简答

介于 5000 和 10000 之间,具体取决于您的系统。

理论

您可以创建一个包含许多 true && true && true && ... 的字符串并对其求值。

  • 如果它返回true,您可以添加更多的&&
  • 如果它因 SystemStackError 甚至段错误而失败,您将需要删除一些 &&

因为它可能会崩溃,所以您需要编写 2 个不同的脚本以防止主循环也崩溃。

bsearch尽可能快地找到极限,而不必遍历每一个可能性。

代码

many_ands.rb

# many_ands.rb
many_ands = (['true'] * (ARGV[0].to_i + 1)).join(' && ')
eval(many_ands)

max_ands.rb

big_number = 100_000

max_ands = (0..big_number).bsearch do |i|
print "Testing #{i} : "
result = system("ruby many_ands.rb #{i}")
puts result ? 'Fine' : "Too many &&'s"
puts
!result
end

puts "Max number of &&'s without exception : #{max_ands - 1}"

输出:

Testing 50000 : many_ands.rb:2:in `eval': stack level too deep (SystemStackError)
from many_ands.rb:2:in `<main>'
Too many &&'s

Testing 25000 : many_ands.rb:2:in `eval': stack level too deep (SystemStackError)
from many_ands.rb:2:in `<main>'
Too many &&'s

Testing 12500 : many_ands.rb:2:in `eval': stack level too deep (SystemStackError)
from many_ands.rb:2:in `<main>'
Too many &&'s

Testing 6250 : many_ands.rb:2:in `eval': stack level too deep (SystemStackError)
from many_ands.rb:2:in `<main>'
Too many &&'s

Testing 3125 : Fine

Testing 4688 : Fine

Testing 5469 : many_ands.rb:2:in `eval': stack level too deep (SystemStackError)
from many_ands.rb:2:in `<main>'
Too many &&'s

Testing 5079 : Fine

Testing 5274 : many_ands.rb:2:in `eval': stack level too deep (SystemStackError)
from many_ands.rb:2:in `<main>'
Too many &&'s

Testing 5177 : many_ands.rb:2:in `eval': stack level too deep (SystemStackError)
from many_ands.rb:2:in `<main>'
Too many &&'s

Testing 5128 : many_ands.rb:2:in `eval': stack level too deep (SystemStackError)
from many_ands.rb:2:in `<main>'
Too many &&'s

Testing 5104 : Fine

Testing 5116 : Fine

Testing 5122 : Fine

Testing 5125 : Fine

Testing 5127 : many_ands.rb:2:in `eval': stack level too deep (SystemStackError)
from many_ands.rb:2:in `<main>'
Too many &&'s

Testing 5126 : many_ands.rb:2:in `eval': stack level too deep (SystemStackError)
from many_ands.rb:2:in `<main>'
Too many &&'s

Max number of &&'s without exception : 5125

这取决于系统:在我的 Linux VM 上,它返回 5125。在服务器上,它返回 7930。

即使在同一系统上,每次运行的结果也略有不同。

评估或&&?

限制从何而来?它是来自传递给 eval 的字符串长度还是来自 && 的数量?

通过修改 many_ands.rb,我们现在将一个大字符串传递给带有许多小表达式的 eval,而不是一个巨大的 && 表达式:

many_ands = (['true'] * (ARGV[0].to_i + 1)).join(';')
eval(many_ands)

主循环输出:

Testing 5000000 : Fine

Testing 7500000 : Fine

Testing 8750000 : Fine

Testing 9375000 : Fine

Testing 9687500 : Fine

Testing 9843750 : Fine

Testing 9921875 : Fine

Testing 9960938 : Fine

Testing 9980469 : Fine

Testing 9990235 : Fine

Testing 9995118 : Fine

Testing 9997559 : Fine

Testing 9998780 : Fine

Testing 9999390 : Fine

Testing 9999695 : Fine

Testing 9999848 : Fine

Testing 9999924 : Fine

Testing 9999962 : Fine

Testing 9999981 : Fine

Testing 9999991 : Fine

Testing 9999996 : Fine

Testing 9999998 : Fine

Testing 9999999 : Fine

Testing 10000000 : Fine

max_and.rb:11:in `<main>': undefined method `-' for nil:NilClass (NoMethodError)

似乎限制确实来自表达式中 && 的数量。如果 true;... 为 1000 万,则传递给 eval 的字符串大小为 50MB。

关于ruby - 一条 "&&"语句可以处理多少个 "if"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43629454/

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