以下代码:
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?
感谢您的帮助!
答案 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!
......只需取出!
。