反向法 - 1.9.1 v 1.8.7

时间:2012-10-10 04:46:18

标签: ruby

我写了一些代码:

output = File.open(text_file).collect.reverse.join("<BR>")

它似乎在1.8.7上工作正常,但抛出错误

NoMethodError - undefined method 'reverse' for #<Enumerator: #<File:C:\EduTester\cron\rufus.log>:collect>:

on 1.9.1(ruby 1.9.3p194(2012-04-20)[i386-mingw32])

有人知道为什么会发生这种情况,如何来解决这个问题? (为什么我最感兴趣。)

4 个答案:

答案 0 :(得分:5)

首先如何修复它 - 你应该这样做:

output = File.open(text_file).to_a.reverse.join("<BR>") 

这适用于任何一个版本的Ruby。基本上你需要在反转它们并添加换行符之前将文件转换为一行数组(.to_a)。

就原因而言(这有点技术性):File混合在Enumerable模块中,它给出了像collect这样的方法。现在在Ruby 1.87中,如果你在没有块的情况下调用Enumberable.collect,它将返回Array。但是在1.9中,它返回Enumerator - 它不响应reverse方法。

以下是该方法的2个版本:

http://ruby-doc.org/core-1.8.7/Enumerable.html#method-i-collect
http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-collect

所以基本上1.9 .collect之前是(hacky)等同于.to_a。但始终使用.to_a将某些内容转换为数组。

答案 1 :(得分:4)

在Ruby 1.8.7中,如果使用collect方法给出块或不给出块,则返回一个数组。 但是在1.9中,如果使用collect方法给出块,它将只返回数组。否则它将返回枚举器对象。 来自documentation -

收集方法 -

为枚举中的每个元素返回一个新数组,其中包含一次运行块的结果。 如果没有给出块,则返回枚举器。

答案 2 :(得分:2)

在1.8.7中,收集方法在应用于File对象时返回数组,而在1.9.3中,它返回枚举数反向方法只能应用于数组。

答案 3 :(得分:0)

这在1.8.7中起作用的原因是当你在1.8.7中没有块的情况下调用Enumerable#collect时,它使用一个只返回其arg的默认块,因此file.collect等同于{ {1}}返回文件中的行数组,您可以在其中调用Array#reverse`

在1.9.x中,在没有块的情况下调用Enumerable#collect会返回Enumerator。枚举器本身不支持file.collect {|x| x},也不支持mixin Enumerable。所以,你得到NoM​​ethodError。

如果您想以与任一版本兼容的方式编写此表达式,请使用#reverse代替#to_a

#collect