summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authortake_cheeze <[email protected]>2014-04-27 23:16:32 +0900
committertake_cheeze <[email protected]>2014-04-27 23:16:32 +0900
commite2f6a905bccb268e6b85650e17d416f41624200f (patch)
treec9e64357c421f432b26a1b9a52697901b286f487
parentbbc237044d0fb1792dff8c5d2466f4e644821239 (diff)
downloadmruby-e2f6a905bccb268e6b85650e17d416f41624200f.tar.gz
mruby-e2f6a905bccb268e6b85650e17d416f41624200f.zip
Implement Struct#to_a and Struct#values .
-rw-r--r--mrbgems/mruby-struct/src/struct.c15
-rw-r--r--mrbgems/mruby-struct/test/struct.rb6
2 files changed, 21 insertions, 0 deletions
diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c
index 43cacbc4e..121226717 100644
--- a/mrbgems/mruby-struct/src/struct.c
+++ b/mrbgems/mruby-struct/src/struct.c
@@ -793,6 +793,19 @@ mrb_struct_len(mrb_state *mrb, mrb_value 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
* an explicit class.
@@ -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
diff --git a/mrbgems/mruby-struct/test/struct.rb b/mrbgems/mruby-struct/test/struct.rb
index a250b0ac6..01e3076a5 100644
--- a/mrbgems/mruby-struct/test/struct.rb
+++ b/mrbgems/mruby-struct/test/struct.rb
@@ -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