зеркало из https://github.com/github/ruby.git
* 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
This commit is contained in:
Родитель
33399fe824
Коммит
1dbe0f0672
5
NEWS
5
NEWS
|
@ -52,6 +52,11 @@ with all sufficient information, see the ChangeLog file.
|
||||||
* Signal.trap raises ArgumentError when :SEGV, :BUS, :ILL, :FPE, :VTALRM
|
* Signal.trap raises ArgumentError when :SEGV, :BUS, :ILL, :FPE, :VTALRM
|
||||||
are specified.
|
are specified.
|
||||||
|
|
||||||
|
* Struct
|
||||||
|
* added method:
|
||||||
|
* added Struct#to_h returning values with keys corresponding to the
|
||||||
|
instance variable names.
|
||||||
|
|
||||||
* Time
|
* Time
|
||||||
* change return value:
|
* change return value:
|
||||||
* Time#to_s returned encoding defaults to US-ASCII but automatically
|
* Time#to_s returned encoding defaults to US-ASCII but automatically
|
||||||
|
|
26
struct.c
26
struct.c
|
@ -586,6 +586,31 @@ rb_struct_to_a(VALUE s)
|
||||||
return rb_ary_new4(RSTRUCT_LEN(s), RSTRUCT_PTR(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: */
|
/* :nodoc: */
|
||||||
VALUE
|
VALUE
|
||||||
rb_struct_init_copy(VALUE copy, VALUE s)
|
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_method(rb_cStruct, "inspect", rb_struct_inspect, 0);
|
||||||
rb_define_alias(rb_cStruct, "to_s", "inspect");
|
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_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, "values", rb_struct_to_a, 0);
|
||||||
rb_define_method(rb_cStruct, "size", rb_struct_size, 0);
|
rb_define_method(rb_cStruct, "size", rb_struct_size, 0);
|
||||||
rb_define_method(rb_cStruct, "length", rb_struct_size, 0);
|
rb_define_method(rb_cStruct, "length", rb_struct_size, 0);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче