Ruby 方法链接的无法解释的行为

Ruby 方法链接的无法解释的行为,ruby,Ruby,这是怎么回事: (0..5580).reduce("A") { |v, n| v = v.ord.chr } 但这并不是: eval('"A"' + ('.ord.chr' * 5580)) 每个人只是在“A”上调用.ord然后.chr5800次。这是完全一样的事情 一方面,这并不完全相同。第一次交替调用chr和ord,最后一次计算出答案 第二个人每次都叫他们两个,答案总是chr。另外,这会使ulimits1紧张,因为整个计算被编译为一个单链 它确实表明,在那里的某个地方通常有一个教训 1

这是怎么回事:

(0..5580).reduce("A") { |v, n| v = v.ord.chr }
但这并不是:

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

每个人只是在“A”上调用
.ord
然后
.chr
5800次。这是完全一样的事情

一方面,这并不完全相同。第一次交替调用
chr
ord
,最后一次计算出答案

第二个人每次都叫他们两个,答案总是
chr
。另外,这会使ulimits1紧张,因为整个计算被编译为一个单链

它确实表明,在那里的某个地方通常有一个教训



1.现在我们很少碰到内存限制,似乎什么都有可能,但这还是有点疯狂,因为每一块ruby都需要一次吃掉整个东西,而不仅仅是重复它。

它们不是完全一样的东西。第一个版本一次调用一个方法,并返回下一次迭代使用的结果。只涉及两个值:迭代的计数器和reduce函数的当前值

另一方面,第二个版本被解释为:

(...((("A".ord).chr).ord).chr) ... ).chr

为了计算最外层的方法,Ruby需要计算第二个外圆括号;要计算该值,需要第三个嵌套返回的值;等等这意味着Ruby需要在堆栈中插入5580个括号来解决这个计算问题,Ruby需要记住在到达底部时要做什么。这是Ruby堆栈可以处理的更多中间步骤,因此会导致
SystemStackError:堆栈级别太深
异常。

首先,后者调用
.ord
.chr
5580次,但前者只调用了一半。所以没有equivalent@MarekLipka哎呀,你说得对。我已经对这个问题做了一个bug修复。所以你说它是在解析过程中发生的。我的实验(我附上了这个长链调用-这次没有eval-在模块方法中(没有调用它),保存了文件并需要它在Ruby中-我还有
SystemStackError
)证实了这一点。我觉得这可能是正确的,但我不完全理解这一点。堆栈与嵌套的方法调用相关。这个案例只是方法链接。