diff options
| author | Jun Hiroe <[email protected]> | 2014-04-11 23:04:15 +0900 |
|---|---|---|
| committer | Jun Hiroe <[email protected]> | 2014-04-11 23:42:40 +0900 |
| commit | 7ed47c1223e6b0c37a5e5e1a14e5fd31ba59bc04 (patch) | |
| tree | 32d9b09d60039f956d2ba4261ff56885d430cc68 /mrbgems/mruby-array-ext | |
| parent | b20d711c4d3d8241da08aaa7688000b007e13c39 (diff) | |
| download | mruby-7ed47c1223e6b0c37a5e5e1a14e5fd31ba59bc04.tar.gz mruby-7ed47c1223e6b0c37a5e5e1a14e5fd31ba59bc04.zip | |
Array#rotate
Diffstat (limited to 'mrbgems/mruby-array-ext')
| -rw-r--r-- | mrbgems/mruby-array-ext/mrblib/array.rb | 31 | ||||
| -rw-r--r-- | mrbgems/mruby-array-ext/test/array.rb | 10 |
2 files changed, 41 insertions, 0 deletions
diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb index 2e66c5fbc..f6adc5255 100644 --- a/mrbgems/mruby-array-ext/mrblib/array.rb +++ b/mrbgems/mruby-array-ext/mrblib/array.rb @@ -351,4 +351,35 @@ class Array end self end + + ## + # call-seq: + # ary.rotate(count=1) -> new_ary + # + # Returns a new array by rotating +self+ so that the element at +count+ is + # the first element of the new array. + # + # If +count+ is negative then it rotates in the opposite direction, starting + # from the end of +self+ where +-1+ is the last element. + # + # a = [ "a", "b", "c", "d" ] + # a.rotate #=> ["b", "c", "d", "a"] + # a #=> ["a", "b", "c", "d"] + # a.rotate(2) #=> ["c", "d", "a", "b"] + # a.rotate(-3) #=> ["b", "c", "d", "a"] + + def rotate(count=1) + ary = [] + len = self.length + + if len > 0 + idx = (count < 0) ? (len - (~count % len) - 1) : (count % len) # rotate count + len.times do + ary << self[idx] + idx += 1 + idx = 0 if idx > len-1 + end + end + ary + end end diff --git a/mrbgems/mruby-array-ext/test/array.rb b/mrbgems/mruby-array-ext/test/array.rb index 8c6a7bd54..650e49642 100644 --- a/mrbgems/mruby-array-ext/test/array.rb +++ b/mrbgems/mruby-array-ext/test/array.rb @@ -146,3 +146,13 @@ assert("Array#reverse_each") do true end end + +assert("Array#rotate") do + a = ["a", "b", "c", "d"] + assert_equal ["b", "c", "d", "a"], a.rotate + assert_equal ["a", "b", "c", "d"], a + assert_equal ["c", "d", "a", "b"], a.rotate(2) + assert_equal ["b", "c", "d", "a"], a.rotate(-3) + assert_equal ["c", "d", "a", "b"], a.rotate(10) + assert_equal [], [].rotate +end |
