0

以下代码:

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?

谢谢您的帮助!

4

2 回答 2

1

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

在第二种情况下,您使用#collect结果。您的问题是,它#strip!要么返回一个字符串,要么返回一个字符串nil,这取决于它的结果——特别是,nil如果字符串没有被修改,它将返回。

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

1.9.3-p194 :005 > (str.split(",")).collect { |x| x.strip }
 => ["1", "hello", "2"] 
于 2012-08-05T16:18:09.000 回答
1

因为如果字符串未更改,则#strip!返回。nil

在您的早期示例中,您没有使用#collect,仅使用#strip!. 在这种情况下使用#each会使非功能性命令式循环更加清晰。通常仅在使用生成的新数组时才使用#map/ 。#collect

你最后的方法看起来不错,你写了一个功能图,但你把 in 留下了#strip!......只需取出!.

于 2012-08-05T16:18:14.127 回答