踩坑之compact!

测试遇到的一个坑,在那里找了大半天,最后发现错误的原因是compact!导致,记录下。

出错原因在于我之前对于compact 与compact!的理解,错误的理解是:compact用于去除数组对象中的nil,而不改变数组对象本身,而compact!与compact唯一的不同在于它会改变调用对象的值。

比如:

a = [ "a", nil, "b", nil, "c" ]

a.compact
#=> ["a", "b", "c"]
a
#=> ["a", nil, "b", nil, "c"]

a.compact!
#=> ["a", "b", "c"]
a
#=> ["a", "b", "c"]

But!!

如果这个数组本身没有nil,两者的结果完全不同。调用compact或者compact!,数组都不变,但是compact!返回的却是nil。

看例子:

b = ["a", "b", "c"]

b.compact
#=> ["a", "b", "c"]
b
#=> ["a", "b", "c"]

b.compact!
#=> nil
b
#=> ["a", "b", "c"]

也就是说在数组中没有nil的情况下,使用compact!返回的值是nil,同时数组本身不会改变

参考

compact!