Commit e1f4e021 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #2138 from take-cheeze/struct_to_a

Implement Struct#to_a and Struct#values .
parents bbc23704 e2f6a905
...@@ -792,6 +792,19 @@ mrb_struct_len(mrb_state *mrb, mrb_value self) ...@@ -792,6 +792,19 @@ mrb_struct_len(mrb_state *mrb, mrb_value self)
return mrb_fixnum_value(RSTRUCT_LEN(self)); return mrb_fixnum_value(RSTRUCT_LEN(self));
} }
/*
* call-seq:
* struct.to_a -> array
* struct.values -> array
*
* Create an array from struct values.
*/
static mrb_value
mrb_struct_to_a(mrb_state *mrb, mrb_value self)
{
return mrb_ary_new_from_values(mrb, RSTRUCT_LEN(self), RSTRUCT_PTR(self));
}
/* /*
* A <code>Struct</code> is a convenient way to bundle a number of * A <code>Struct</code> is a convenient way to bundle a number of
* attributes together, using accessor methods, without having to write * attributes together, using accessor methods, without having to write
...@@ -827,6 +840,8 @@ mrb_mruby_struct_gem_init(mrb_state* mrb) ...@@ -827,6 +840,8 @@ mrb_mruby_struct_gem_init(mrb_state* mrb)
mrb_define_method(mrb, st, "size", mrb_struct_len, MRB_ARGS_NONE()); mrb_define_method(mrb, st, "size", mrb_struct_len, MRB_ARGS_NONE());
mrb_define_method(mrb, st, "length", mrb_struct_len, MRB_ARGS_NONE()); mrb_define_method(mrb, st, "length", mrb_struct_len, MRB_ARGS_NONE());
mrb_define_method(mrb, st, "to_a", mrb_struct_to_a, MRB_ARGS_NONE());
mrb_define_method(mrb, st, "values", mrb_struct_to_a, MRB_ARGS_NONE());
} }
void void
......
...@@ -112,3 +112,9 @@ assert('Struct#length, Struct#size') do ...@@ -112,3 +112,9 @@ assert('Struct#length, Struct#size') do
assert_equal 2, s.size assert_equal 2, s.size
assert_equal 2, s.length assert_equal 2, s.length
end end
assert('Struct#to_a, Struct#values') do
s = Struct.new(:mem1, :mem2).new('a', 'b')
assert_equal ['a', 'b'], s.to_a
assert_equal ['a', 'b'], s.values
end
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