summaryrefslogtreecommitdiff
path: root/hash.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-13 08:44:17 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-13 08:44:17 +0000
commit8d4086d77366501d0c04f2b36303d3e7dfd2bcb0 (patch)
treebd00cba076e8a2176385657a1dcbd38a3d686432 /hash.c
parent3e7d8bf9f8bbdaad4f36819f14fb5c4cf2ea9d35 (diff)
* hash.c (rb_hash_set_default_proc): add new method. a patch from
Giuseppe Bilotta. #419 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18577 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/hash.c b/hash.c
index ee90a840bb..a1517db5de 100644
--- a/hash.c
+++ b/hash.c
@@ -11,6 +11,7 @@
**********************************************************************/
+#include "eval_intern.h"
#include "ruby/ruby.h"
#include "ruby/st.h"
#include "ruby/util.h"
@@ -623,6 +624,37 @@ rb_hash_default_proc(VALUE hash)
return Qnil;
}
+/*
+ * call-seq:
+ * hsh.default_proc = proc_obj => proc_obj
+ *
+ * Sets the default proc to be executed on each key lookup.
+ *
+ * h.default_proc = proc do |hash, key|
+ * hash[key] = key + key
+ * end
+ * h[2] #=> 4
+ * h["cat"] #=> "catcat"
+ */
+
+static VALUE
+rb_hash_set_default_proc(VALUE hash, VALUE proc)
+{
+ VALUE b;
+
+ rb_hash_modify(hash);
+ b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
+ if (NIL_P(b) || !rb_obj_is_proc(b)) {
+ rb_raise(rb_eTypeError,
+ "wrong default_proc type %s (expected Proc)",
+ rb_obj_classname(proc));
+ }
+ proc = b;
+ RHASH(hash)->ifnone = proc;
+ FL_SET(hash, HASH_PROC_DEFAULT);
+ return proc;
+}
+
static int
key_i(VALUE key, VALUE value, VALUE *args)
{
@@ -2596,6 +2628,7 @@ Init_Hash(void)
rb_define_method(rb_cHash,"default", rb_hash_default, -1);
rb_define_method(rb_cHash,"default=", rb_hash_set_default, 1);
rb_define_method(rb_cHash,"default_proc", rb_hash_default_proc, 0);
+ rb_define_method(rb_cHash,"default_proc=", rb_hash_set_default_proc, 1);
rb_define_method(rb_cHash,"key", rb_hash_key, 1);
rb_define_method(rb_cHash,"index", rb_hash_index, 1);
rb_define_method(rb_cHash,"size", rb_hash_size, 0);