我有以下代码:
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;”。
答案 0 :(得分:8)
有趣的问题!
5000到10000之间,具体取决于您的系统。
您可以创建一个包含许多true && true && true && ...
的字符串并对其进行评估。
true
,您可以添加更多&&
s。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
的字符串长度还是来自&&
s的数量?
通过修改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)
似乎限制确实来自表达式中&&
的数量。有1000万true;...
,传递给eval
的字符串大50MB。
答案 1 :(得分:4)
我意识到使用4
if
的{{1}}语句可以正常工作但是当我 开始添加第五个它不会。
您在声明中使用的&&
数量没有限制。所以它适用于4,5,100。
失败是因为某些条件是假的。
答案 2 :(得分:3)
as
是一个布尔运算符。它可以容纳多少if语句没有理论上的限制。
在Ruby中使用批量语句可以被认为是TransitionsEverywhere,但是没有技术上的理由说明为什么你不能这样做。
你得到什么错误?