diff options
Diffstat (limited to 'mrbgems/mruby-array-ext')
| -rw-r--r-- | mrbgems/mruby-array-ext/mrblib/array.rb | 5 | ||||
| -rw-r--r-- | mrbgems/mruby-array-ext/src/array.c | 13 | ||||
| -rw-r--r-- | mrbgems/mruby-array-ext/test/array.rb | 22 |
3 files changed, 31 insertions, 9 deletions
diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb index 3a4b1460b..fd80fa0bb 100644 --- a/mrbgems/mruby-array-ext/mrblib/array.rb +++ b/mrbgems/mruby-array-ext/mrblib/array.rb @@ -58,7 +58,7 @@ class Array ary = self.dup if block ary.uniq!(&block) - else + else ary.uniq! end ary @@ -370,7 +370,7 @@ class Array self[i] = block.call(i) i += 1 end - else + else while i < len self[i] = arg0 i += 1 @@ -617,7 +617,6 @@ class Array return to_enum :delete_if unless block_given? idx = 0 - len = self.size while idx < self.size do if block.call(self[idx]) self.delete_at(idx) diff --git a/mrbgems/mruby-array-ext/src/array.c b/mrbgems/mruby-array-ext/src/array.c index ad6cead2c..ae9d8296e 100644 --- a/mrbgems/mruby-array-ext/src/array.c +++ b/mrbgems/mruby-array-ext/src/array.c @@ -1,6 +1,7 @@ #include "mruby.h" #include "mruby/value.h" #include "mruby/array.h" +#include "mruby/range.h" /* * call-seq: @@ -122,6 +123,17 @@ mrb_ary_at(mrb_state *mrb, mrb_value ary) return mrb_ary_entry(ary, pos); } +static mrb_value +mrb_ary_values_at(mrb_state *mrb, mrb_value self) +{ + mrb_int argc; + mrb_value *argv; + + mrb_get_args(mrb, "*", &argv, &argc); + + return mrb_get_values_at(mrb, self, RARRAY_LEN(self), argc, argv, mrb_ary_ref); +} + void mrb_mruby_array_ext_gem_init(mrb_state* mrb) { @@ -132,6 +144,7 @@ mrb_mruby_array_ext_gem_init(mrb_state* mrb) mrb_define_method(mrb, a, "assoc", mrb_ary_assoc, MRB_ARGS_REQ(1)); mrb_define_method(mrb, a, "at", mrb_ary_at, MRB_ARGS_REQ(1)); mrb_define_method(mrb, a, "rassoc", mrb_ary_rassoc, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, a, "values_at", mrb_ary_values_at, MRB_ARGS_ANY()); } void diff --git a/mrbgems/mruby-array-ext/test/array.rb b/mrbgems/mruby-array-ext/test/array.rb index f94189356..1fa7cfc04 100644 --- a/mrbgems/mruby-array-ext/test/array.rb +++ b/mrbgems/mruby-array-ext/test/array.rb @@ -19,7 +19,7 @@ end assert("Array#at") do a = [ "a", "b", "c", "d", "e" ] assert_equal "a", a.at(0) - assert_equal "e", a.at(-1) + assert_equal "e", a.at(-1) end assert("Array#rassoc") do @@ -50,7 +50,7 @@ assert("Array#uniq") do assert_equal [1, 2, 3, 1], a b = [["student","sam"], ["student","george"], ["teacher","matz"]] - assert_equal [["student", "sam"], ["teacher", "matz"]], b.uniq { |s| s.first } + assert_equal [["student", "sam"], ["teacher", "matz"]], b.uniq { |s| s.first } end assert("Array#-") do @@ -60,7 +60,7 @@ assert("Array#-") do assert_raise(TypeError) { a - c } assert_equal [2, 3], (a - b) - assert_equal [1, 2, 3, 1], a + assert_equal [1, 2, 3, 1], a end assert("Array#|") do @@ -70,7 +70,7 @@ assert("Array#|") do assert_raise(TypeError) { a | c } assert_equal [1, 2, 3, 4], (a | b) - assert_equal [1, 2, 3, 1], a + assert_equal [1, 2, 3, 1], a end assert("Array#&") do @@ -79,8 +79,8 @@ assert("Array#&") do c = 1 assert_raise(TypeError) { a & c } - assert_equal [1], (a & b) - assert_equal [1, 2, 3, 1], a + assert_equal [1], (a & b) + assert_equal [1, 2, 3, 1], a end assert("Array#flatten") do @@ -280,3 +280,13 @@ assert("Array#select!") do assert_equal [4, 5], a.select! { |val| val > 3 } assert_equal [4, 5], a end + +assert('Array#values_at') do + a = %w{red green purple white none} + + assert_equal %w{red purple none}, a.values_at(0, 2, 4) + assert_equal ['green', 'white', nil, nil], a.values_at(1, 3, 5, 7) + assert_equal ['none', 'white', 'white', nil], a.values_at(-1, -2, -2, -7) + assert_equal ['none', nil, nil, 'red', 'green', 'purple'], a.values_at(4..6, 0...3) + assert_raise(TypeError) { a.values_at 'tt' } +end |
