Ruby 1.9中的Array.to_s行为有所不同?

16

我写了一个小应用程序,它使用一些关键字的基本代码文件、一个替换关键字的文件,并输出一个替换后关键字的新文件。

当我使用 Ruby 1.8 时,我的输出看起来很好。但现在使用 Ruby 1.9 时,替换后的代码中出现了换行符而不是回车符。

例如,我看到类似这样的内容:

["\r\nDim RunningNormal_1 As Boolean", "\r\nDim RunningNormal_2 As Boolean", "\r\nDim RunningNormal_3 As Boolean"]

改为:

Dim RunningNormal_1 As Boolean
Dim RunningNormal_2 As Boolean
Dim RunningNormal_3 As Boolean

我使用替换哈希表{"KEYWORD"=>["1","2","3"]}和被替换行的数组。

我使用以下代码块完成替换:

resultingLibs.each do |x|
  libraryString.sub!(/(<REPEAT>(.*?)<\/REPEAT>)/im) do |match|
    x.each do |individual|
      individual.to_s 
    end
  end
end
#for each resulting group of the repeatable pattern,
#  
#Write out the resulting libs to a combined string
我的直觉是我打印的是数组而不是数组内的字符串。有什么修复建议吗?当我使用puts调试和打印替换后的字符串时,输出看起来是正确的。但当我使用to_s方法(这是我的应用程序将输出写入输出文件的方式)时,我的输出看起来是错误的。
一个修复方法会很好,但我真正想知道的是Ruby 1.8和1.9之间发生了什么导致出现这种行为。在Ruby 1.9中,to_s方法是否发生了变化?
*我对Ruby不熟练

我添加了源代码,希望它是相关的。 - jrsconfitto
我经常使用Ruby 1.8和1.9,但从未了解过这个区别! - Andrew Grimm
2个回答

29

是的,你正在调用一个字符串数组的to_s方法。在1.8中,这等同于调用join方法,在1.9中则相当于调用inspect方法。

为了在1.8和1.9中获得所需的行为,请调用join方法而不是to_s方法。


inspect 什么时候有用? - chongman
@chongman 你是指针对 to_s 的数组吗?如果你要检查的东西实际上并不是一个数组,那么使用它会很有用。此外,使用 p/inspect 来检查数组更清晰、更一致,因为这也是你用来检查其他值的方式。 - sepp2k
谢谢。我意识到我的困惑是1.8.6(?)与1.9的问题。教程展示了' "The Cat In Hat".to_a ',然后我假设'to_s'应该返回原始字符串,在我认为1.8.6中确实如此。在1.9中,to_a被消除作为字符串的方法。'split(" ")'和'join'是它们的反义词。 - chongman

3
请查看这里,在Array下方。
Array#to_s is equivalent to Array#inspect

[1,2,3,4].to_s                                    # => "[1, 2, 3, 4]"

instead of

RUBY_VERSION                                      # => "1.8.5"
[1,2,3,4].to_s                                    # => "1234"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接