使用方法链接无法解释的行为

时间:2016-02-04 21:23:02

标签: ruby

为什么会这样:

(0..5580).reduce("A") { |v, n| v = v.ord.chr }

但这不是:

eval('"A"' + ('.ord.chr' * 5580))

每个人只需拨打.ord,然后{"" A" 5800次。这是完全相同的事情。

2 个答案:

答案 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。我们遇到了内存限制,所以现在看起来很少有任何可能,但是这仍然有点疯狂,因为每一块红宝石需要立刻吃掉整个东西,而不是只是迭代它。