aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-04-16 03:15:42 +0000
committermarcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-04-16 03:15:42 +0000
commitf92be2c01a7417c88b47373a4e43aabd7918f225 (patch)
tree9b3ef29b0ce670bcaa9afa4a821835f114c35eea
parent0c7163ae5ea5f701f13726e39729e0727b53bf55 (diff)
downloadruby-f92be2c01a7417c88b47373a4e43aabd7918f225.tar.gz
* hash.c: Add Hash#to_h [Feature #6276]
[rubyspec:84b7fe3f24d2] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35339 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--NEWS2
-rw-r--r--hash.c25
2 files changed, 27 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index e390b9f09a..61b56b3ad1 100644
--- a/NEWS
+++ b/NEWS
@@ -22,6 +22,8 @@ with all sufficient information, see the ChangeLog file.
* added Enumerable#lazy method for lazy enumeration.
* Hash
+ * added method:
+ * added Hash#to_h as explicit conversion method, like Array#to_a.
* extended method:
* Hash#default_proc= can be passed nil to clear the default proc.
diff --git a/hash.c b/hash.c
index 1b495c788c..e255dab3ed 100644
--- a/hash.c
+++ b/hash.c
@@ -1452,6 +1452,30 @@ rb_hash_to_hash(VALUE hash)
return hash;
}
+/*
+ * call-seq:
+ * hsh.to_h -> hsh or new_hash
+ *
+ * Returns +self+. If called on a subclass of Hash, converts
+ * the receiver to a Hash object.
+ */
+
+static VALUE
+rb_hash_to_h(VALUE hash)
+{
+ if (rb_obj_class(hash) != rb_cHash) {
+ VALUE ret = rb_hash_new();
+ if (!RHASH_EMPTY_P(hash))
+ RHASH(ret)->ntbl = st_copy(RHASH(hash)->ntbl);
+ if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
+ FL_SET(ret, HASH_PROC_DEFAULT);
+ }
+ RHASH_IFNONE(ret) = RHASH_IFNONE(hash);
+ return ret;
+ }
+ return hash;
+}
+
static int
keys_i(VALUE key, VALUE value, VALUE ary)
{
@@ -3333,6 +3357,7 @@ Init_Hash(void)
rb_define_method(rb_cHash,"rehash", rb_hash_rehash, 0);
rb_define_method(rb_cHash,"to_hash", rb_hash_to_hash, 0);
+ rb_define_method(rb_cHash,"to_h", rb_hash_to_h, 0);
rb_define_method(rb_cHash,"to_a", rb_hash_to_a, 0);
rb_define_method(rb_cHash,"inspect", rb_hash_inspect, 0);
rb_define_alias(rb_cHash, "to_s", "inspect");