Commit e2f6a905 authored by take_cheeze's avatar take_cheeze

Implement Struct#to_a and Struct#values .

parent bbc23704
......@@ -792,6 +792,19 @@ mrb_struct_len(mrb_state *mrb, mrb_value 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
* attributes together, using accessor methods, without having to write
......@@ -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, "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
......
......@@ -112,3 +112,9 @@ assert('Struct#length, Struct#size') do
assert_equal 2, s.size
assert_equal 2, s.length
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