若您编写的脚本打开File之后就不管了的话,可能会引起不好的后果。如果恰好遇上像SunOS 4.X这种奇怪的系统的话,那么它的结果肯定能让您大吃一惊。
在stdio中,以char来保存文件描述符。若一直不断地打开文件的话,文件描述符会变成负值,引起EBADF。
while
str = File.open(name).read
:
end
这时,请不要让GC来关闭文件,而应该这样
while
begin
f = File.open(name)
str = f.read
ensure
f.close
end
:
end
或者这样
str = nil
while
File.open(name) { |f| str = f.read }
:
end
来手动关闭文件,以确保close能被正确地执行。
每次从IO中读取内容时,都会生成新的对象。若在平时,这也没什么大不了的。如果您总是忽视这个问题的话,则可能会编写出非常蹩脚的程序。
这里假设您编写这么一个程序:它会检查某二进制文件中是否包含两个大小为400byte的连在一起的块。若一共要检查400多个的块的话,脚本中的循环会导致系统死机一分钟。尽管可以归咎到内存不足等问题上,但这样的代码本身就存在问题。
根据实际的需要,您可以编写类似于[ruby-list:23467]这样的东西。但更好的解决方案或许就是,在这种情况下避免使用ruby。