Ruby中明显的全局范围泄露

时间:2010-11-29 18:17:27

标签: ruby

我发现此代码和示例执行存在一个非常奇怪的问题:https://gist.github.com/720278

两个文件中的数据相同,但由于某种原因,应用程序在第二个文件上失败。仅为此文件运行应用程序工作正常,只有在一次执行中处理多个文件时才会中断。例外并没有帮助我跟踪事情(抱怨map()s正常工作)。

我希望有人之前可能会看到这样的事情,并且可以指出我正确的方向。

1 个答案:

答案 0 :(得分:2)

您的代码适用于MRI 1.9,但不适用于MRI 1.8.7。在这种情况下,问题来自字符串下标的工作方式的差异。

def split_comments!
  @comments = @input_data.select { |line| line[0] == "#" }
  parse_header_attributes
  @input_data.delete_if { |line| line[0] == "#" }
end

此方法旨在通过使用line[0]检查每行的第一个字符来将注释与数据分开。在Ruby 1.9中,这将第一个字符作为字符串返回。但是,在Ruby< 1.9中,这会将第一个字符作为整数返回。为了在旧版本的ruby中使用,请使用line[0..0]代替line[0]

def split_comments!
  @comments = @input_data.select { |line| line[0..0] == "#" }
  parse_header_attributes
  @input_data.delete_if { |line| line[0..0] == "#" }
end

您可能会发现使用正则表达式来测试评论更为简洁:line =~ /^#/。方法Array#partition也可以在这里发挥出色:

def split_comments!
  @comments, @input_data = @input_data.partition do |line|
    line =~ /^#/
  end
  parse_header_attributes
end

通过对git树的更新,它可以在没有错误的情况下运行,处理多个文件时以及连续运行两次。