为什么会这样:
(0..5580).reduce("A") { |v, n| v = v.ord.chr }
但这不是:
eval('"A"' + ('.ord.chr' * 5580))
每个人只需拨打.ord
,然后{"" A" 5800次。这是完全相同的事情。
答案 0 :(得分:3)
它们并非完全相同。第一个版本一次调用一个方法,并返回下一次迭代使用的结果。只涉及两个值:迭代计数器和reduce函数的当前值。
另一方面,第二个版本被解释为:
(...((("A".ord).chr).ord).chr) ... ).chr
要计算最外层的方法,Ruby需要计算第二个外括号;要计算,它需要第三个嵌套返回的值;等等。这意味着Ruby需要将5580个括号深入到堆栈中以解决此评估,并且Ruby需要记住在返回到底部时返回的路上要做什么。这是Ruby堆栈可以处理的更多中间步骤,因此会导致SystemStackError: stack level too deep
异常。
答案 1 :(得分:0)
首先,它并不完全相同。第一个是交替调用<!--<item name="android:colorBackground">...</item>-->
和chr
,答案是计算的最后一个。
第二次调用它们,答案始终为ord
。另外,那个菌株ulimits 1 因为整个计算被编译为单链。
它确实表明那里通常有一堂课。
<小时/> 1。我们遇到了内存限制,所以现在看起来很少有任何可能,但是这仍然有点疯狂,因为每一块红宝石需要立刻吃掉整个东西,而不是只是迭代它。