剥离在Ruby中的splitted数组上收集

时间:2012-08-05 16:12:18

标签: ruby

以下代码:

str = "1, hello,2"
puts str
arr = str.split(",")
puts arr.inspect
arr.collect { |x| x.strip! }
puts arr.inspect

产生以下结果:

1, hello,2
["1", " hello", "2"]
["1", "hello", "2"]

这是预期的。以下代码:

str = "1, hello,2"
puts str
arr = (str.split(",")).collect { |x| x.strip! }
puts arr.inspect

但是会产生以下输出:

1, hello,2
[nil, "hello", nil]

为什么我会得到这些“零”?为什么我不能立即在分裂阵列上执行.collect?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

#collect方法将返回每个块调用返回的值的数组。在第一个示例中,您使用#strip!修改实际的数组内容并使用它们,而忽略#collect的返回值。

在第二种情况下,您使用#collect结果。您的问题是#strip!将返回字符串或nil,具体取决于其结果 - 尤其是,如果字符串未被修改,它将返回nil

因此,请使用#strip(不带感叹号):

1.9.3-p194 :005 > (str.split(",")).collect { |x| x.strip }
 => ["1", "hello", "2"] 

答案 1 :(得分:1)

如果字符串未被更改,#strip!会返回nil

在您的早期示例中,您没有使用#collect,的结果只使用#strip!修改字符串。在这种情况下使用#each会使非功能性命令循环更加清晰。只有在使用生成的新数组时才会使用#map / #collect

你最后的方法看起来不错,你写了一张功能地图,但你离开了#strip! ......只需取出!