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



我有以下代码:

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

我意识到使用四个"&amp;&amp;"的if语句效果很好,但是一个拥有五分之一的语句不会。我该如何处理?


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

有趣的问题!

简短答案

在5000到10000之间,具体取决于您的系统。

理论

您可以使用许多true && true && true && ...创建一个字符串并进行评估。

  • 如果它返回true,您可以添加更多&&s。
  • 如果SystemStackError甚至分段故障失败,您需要删除一些&&s。

由于它可能会崩溃,因此您需要编写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。

结果从一个运行到另一个系统,即使在同一系统上也有所不同。

评估或&amp;&amp;?

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

通过修改many_ands.rb,我们现在通过一个大字符串来评估许多小表达式,而不是一个巨大的&&表达式:

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)

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

我意识到使用4 &&if语句正常工作,但是当我 开始添加五分之一,它不会。

您在语句中使用的&&的数量没有限制。因此,它将与4、5、100。

一起使用

因为某些条件是虚假的。

&&是布尔运算符。关于它可以持有的语句,没有理论上的限制。

在Ruby中使用单个语句中使用批次可以被视为代码气味,但是没有技术原因您不能这样做。

您遇到什么错误?

最新更新