我写了一些代码:
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])
有人知道为什么会发生这种情况,如何来解决这个问题? (为什么我最感兴趣。)
答案 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)
答案 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
。所以,你得到NoMethodError。
如果您想以与任一版本兼容的方式编写此表达式,请使用#reverse
代替#to_a
。
#collect