Commit 39c036ab authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #2115 from ksss/ary-fill

Fix Array#fill bug and behavior
parents fdcea862 4652c7ca
...@@ -323,11 +323,13 @@ class Array ...@@ -323,11 +323,13 @@ class Array
# ary.fill { |index| block } -> ary # ary.fill { |index| block } -> ary
beg = 0 beg = 0
len = self.size len = self.size
elsif arg0 != nil && arg0.respond_to?(:begin) && arg0.respond_to?(:end) elsif arg0 != nil && arg0.kind_of?(Range)
# ary.fill(range) { |index| block } -> ary # ary.fill(range) { |index| block } -> ary
beg = arg0.begin beg = arg0.begin
beg += self.size if beg < 0 beg += self.size if beg < 0
len = arg0.end - beg + 1 len = arg0.end
len += self.size if len < 0
len += 1 unless arg0.exclude_end?
elsif arg0 != nil elsif arg0 != nil
# ary.fill(start [, length] ) { |index| block } -> ary # ary.fill(start [, length] ) { |index| block } -> ary
beg = arg0 beg = arg0
...@@ -343,11 +345,13 @@ class Array ...@@ -343,11 +345,13 @@ class Array
# ary.fill(obj) -> ary # ary.fill(obj) -> ary
beg = 0 beg = 0
len = self.size len = self.size
elsif arg0 != nil && arg1 != nil && arg1.respond_to?(:begin) && arg1.respond_to?(:end) elsif arg0 != nil && arg1 != nil && arg1.kind_of?(Range)
# ary.fill(obj, range ) -> ary # ary.fill(obj, range ) -> ary
len = self.size
beg = arg1.begin beg = arg1.begin
len = arg1.end - beg + 1 beg += self.size if beg < 0
len = arg1.end
len += self.size if len < 0
len += 1 unless arg1.exclude_end?
elsif arg0 != nil && arg1 != nil elsif arg0 != nil && arg1 != nil
# ary.fill(obj, start [, length]) -> ary # ary.fill(obj, start [, length]) -> ary
beg = arg1 beg = arg1
...@@ -355,7 +359,7 @@ class Array ...@@ -355,7 +359,7 @@ class Array
if arg2 == nil if arg2 == nil
len = self.size len = self.size
else else
len = arg1 + arg2 len = beg + arg2
end end
end end
end end
......
...@@ -133,6 +133,23 @@ assert("Array#fill") do ...@@ -133,6 +133,23 @@ assert("Array#fill") do
assert_equal [0, 2, 3, 27], a.fill(1, 2) { |i| i+1 } assert_equal [0, 2, 3, 27], a.fill(1, 2) { |i| i+1 }
assert_equal [1, 2, 3, 27], a.fill(0..1) { |i| i+1 } assert_equal [1, 2, 3, 27], a.fill(0..1) { |i| i+1 }
assert_raise(ArgumentError) { a.fill } assert_raise(ArgumentError) { a.fill }
assert_equal([0, 1, 2, 3, -1, 5], [0, 1, 2, 3, 4, 5].fill(-1, -2, 1))
assert_equal([0, 1, 2, 3, -1, -1, -1], [0, 1, 2, 3, 4, 5].fill(-1, -2, 3))
assert_equal([0, 1, 2, -1, -1, 5], [0, 1, 2, 3, 4, 5].fill(-1, 3..4))
assert_equal([0, 1, 2, -1, 4, 5], [0, 1, 2, 3, 4, 5].fill(-1, 3...4))
assert_equal([0, 1, -1, -1, -1, 5], [0, 1, 2, 3, 4, 5].fill(-1, 2..-2))
assert_equal([0, 1, -1, -1, 4, 5], [0, 1, 2, 3, 4, 5].fill(-1, 2...-2))
assert_equal([0, 1, 2, 13, 14, 5], [0, 1, 2, 3, 4, 5].fill(3..4){|i| i+10})
assert_equal([0, 1, 2, 13, 4, 5], [0, 1, 2, 3, 4, 5].fill(3...4){|i| i+10})
assert_equal([0, 1, 12, 13, 14, 5], [0, 1, 2, 3, 4, 5].fill(2..-2){|i| i+10})
assert_equal([0, 1, 12, 13, 4, 5], [0, 1, 2, 3, 4, 5].fill(2...-2){|i| i+10})
assert_equal [1, 2, 3, 4, 'x', 'x'], [1, 2, 3, 4, 5, 6].fill('x', -2..-1)
assert_equal [1, 2, 3, 4, 'x', 6], [1, 2, 3, 4, 5, 6].fill('x', -2...-1)
assert_equal [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6].fill('x', -2...-2)
assert_equal [1, 2, 3, 4, 'x', 6], [1, 2, 3, 4, 5, 6].fill('x', -2..-2)
assert_equal [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6].fill('x', -2..0)
end end
assert("Array#reverse_each") do assert("Array#reverse_each") do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment