From 1dbe0f0672cfc16c875d0a47bde266ddbaa8ba98 Mon Sep 17 00:00:00 2001 From: marcandre Date: Mon, 16 Apr 2012 03:16:10 +0000 Subject: [PATCH] * 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 --- NEWS | 5 +++++ struct.c | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/NEWS b/NEWS index 87c9dcf743..c8c367ce63 100644 --- a/NEWS +++ b/NEWS @@ -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 diff --git a/struct.c b/struct.c index 7fa50f14ee..e958a78df8 100644 --- a/struct.c +++ b/struct.c @@ -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