Permalink
Browse files

* struct.c: Add Struct#to_h [Feature #6276]

  [ref #4862] [rubyspec:2082ef46d46e]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35341 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information...
1 parent 33399fe commit 1dbe0f0672cfc16c875d0a47bde266ddbaa8ba98 @marcandre marcandre committed Apr 16, 2012
Showing with 31 additions and 0 deletions.
  1. +5 −0 NEWS
  2. +26 −0 struct.c
View
@@ -52,6 +52,11 @@ with all sufficient information, see the ChangeLog file.
* Signal.trap raises ArgumentError when :SEGV, :BUS, :ILL, :FPE, :VTALRM
are specified.
+ * Struct
+ * added method:
+ * added Struct#to_h returning values with keys corresponding to the
+ instance variable names.
+
* Time
* change return value:
* Time#to_s returned encoding defaults to US-ASCII but automatically
View
@@ -586,6 +586,31 @@ rb_struct_to_a(VALUE s)
return rb_ary_new4(RSTRUCT_LEN(s), RSTRUCT_PTR(s));
}
+/*
+ * call-seq:
+ * struct.to_h -> hash
+ *
+ * Returns the values for this instance as a hash with keys
+ * corresponding to the instance variable name.
+ *
+ * Customer = Struct.new(:name, :address, :zip)
+ * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
+ * joe.to_h[:address] #=> "123 Maple, Anytown NC"
+ */
+
+static VALUE
+rb_struct_to_h(VALUE s)
+{
+ VALUE h = rb_hash_new();
+ VALUE members = rb_struct_members(s);
+ long i;
+
+ for (i=0; i<RSTRUCT_LEN(s); i++) {
+ rb_hash_aset(h, rb_ary_entry(members, i), RSTRUCT_PTR(s)[i]);
+ }
+ return h;
+}
+
/* :nodoc: */
VALUE
rb_struct_init_copy(VALUE copy, VALUE s)
@@ -961,6 +986,7 @@ Init_Struct(void)
rb_define_method(rb_cStruct, "inspect", rb_struct_inspect, 0);
rb_define_alias(rb_cStruct, "to_s", "inspect");
rb_define_method(rb_cStruct, "to_a", rb_struct_to_a, 0);
+ rb_define_method(rb_cStruct, "to_h", rb_struct_to_h, 0);
rb_define_method(rb_cStruct, "values", rb_struct_to_a, 0);
rb_define_method(rb_cStruct, "size", rb_struct_size, 0);
rb_define_method(rb_cStruct, "length", rb_struct_size, 0);

0 comments on commit 1dbe0f0

Please sign in to comment.