Array bang methods should return nil if no change happen

This commit is contained in:
Yukihiro Matz Matsumoto
2013-03-23 10:54:09 +09:00
parent 6804ab3ab8
commit 5717994452
+31 -6
View File
@@ -6,11 +6,17 @@ class Array
result << ary.shift
ary.delete(result.last)
end
self.replace(result)
if result.size == self.size
nil
else
self.replace(result)
end
end
def uniq
self.dup.uniq!
ary = self.dup
ary.uniq!
ary
end
def -(elem)
@@ -26,7 +32,8 @@ class Array
def |(elem)
raise TypeError, "can't convert to Array" unless elem.class == Array
(self + elem).uniq!
ary = self + elem
ary.uniq! or ary
end
def &(elem)
@@ -56,8 +63,22 @@ class Array
ar
end
def flatten!
self.replace(self.flatten)
def flatten!(depth=nil)
modified = false
ar = []
self.each do |e|
if e.is_a?(Array) && (depth.nil? || depth > 0)
ar += e.flatten(depth.nil? ? nil : depth - 1)
modified = true
else
ar << e
end
end
if modified
self.replace(ar)
else
nil
end
end
def compact
@@ -68,6 +89,10 @@ class Array
def compact!
result = self.select { |e| e != nil }
self.replace(result)
if result.size == self.size
nil
else
self.replace(result)
end
end
end