[前][次][番号順一覧][スレッド一覧]

ruby-changes:22318

From: matz <ko1@a...>
Date: Tue, 24 Jan 2012 13:02:41 +0900 (JST)
Subject: [ruby-changes:22318] matz:r34367 (trunk): * object.c (rb_Hash): add Kernel#Hash conversion method like

matz	2012-01-24 13:02:30 +0900 (Tue, 24 Jan 2012)

  New Revision: 34367

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34367

  Log:
    * object.c (rb_Hash): add Kernel#Hash conversion method like
      Array() or Float().  a patch from Run Paint Run Run.  Fix #3131

  Modified files:
    trunk/ChangeLog
    trunk/include/ruby/intern.h
    trunk/object.c
    trunk/test/ruby/test_object.rb

Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h	(revision 34366)
+++ include/ruby/intern.h	(revision 34367)
@@ -559,6 +559,7 @@
 VALUE rb_Float(VALUE);
 VALUE rb_String(VALUE);
 VALUE rb_Array(VALUE);
+VALUE rb_Hash(VALUE);
 double rb_cstr_to_dbl(const char*, int);
 double rb_str_to_dbl(VALUE, int);
 /* parse.y */
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 34366)
+++ ChangeLog	(revision 34367)
@@ -1,3 +1,8 @@
+Tue Jan 24 12:58:41 2012  Yukihiro Matsumoto  <matz@r...>
+
+	* object.c (rb_Hash): add Kernel#Hash conversion method like
+	  Array() or Float().  a patch from Run Paint Run Run.  Fix #3131
+
 Tue Jan 24 11:38:05 2012  NARUSE, Yui  <naruse@r...>
 
 	* lib/uri/common.rb (URI.encode_www_form_component): initialize on
Index: object.c
===================================================================
--- object.c	(revision 34366)
+++ object.c	(revision 34367)
@@ -2594,7 +2594,40 @@
     return rb_Array(arg);
 }
 
+VALUE
+rb_Hash(VALUE val)
+{
+    if (NIL_P(val)) return rb_hash_new();
+    VALUE tmp = rb_check_hash_type(val);
+    if (NIL_P(tmp)) {
+	if (TYPE(val) == T_ARRAY && RARRAY_LEN(val) == 0) 
+	    return rb_hash_new();
+	rb_raise(rb_eTypeError, "can't convert %s into Hash", rb_obj_classname(val));
+    }
+    return tmp;
+}
+
 /*
+ *  call-seq:
+ *     Hash(arg)    -> hash
+ *
+ *  Converts <i>arg</i> to a <code>Hash</code> by calling
+ *  <i>arg</i><code>.to_hash</code>. Returns an empty <code>Hash</code> when
+ *  <i>arg</i> is <tt>nil</tt> or <tt>[]</tt>.
+ *
+ *     Hash([])          #=> {}
+ *     Hash(nil)         #=> nil
+ *     Hash(key: :value) #=> {:key => :value}
+ *     Hash([1, 2, 3])   #=> TypeError
+ */
+
+static VALUE
+rb_f_hash(VALUE obj, VALUE arg)
+{
+    return rb_Hash(arg);
+}
+
+/*
  *  Document-class: Class
  *
  *  Classes in Ruby are first-class objects---each is an instance of
@@ -2839,6 +2872,7 @@
 
     rb_define_global_function("String", rb_f_string, 1);
     rb_define_global_function("Array", rb_f_array, 1);
+    rb_define_global_function("Hash", rb_f_hash, 1);
 
     rb_cNilClass = rb_define_class("NilClass", rb_cObject);
     rb_define_method(rb_cNilClass, "to_i", nil_to_i, 0);
Index: test/ruby/test_object.rb
===================================================================
--- test/ruby/test_object.rb	(revision 34366)
+++ test/ruby/test_object.rb	(revision 34367)
@@ -197,6 +197,19 @@
     assert_equal([o], Array(o))
   end
 
+  def test_convert_hash
+    assert_equal(Hash(nil), {})
+    assert_equal(Hash([]), {})
+    assert_equal(Hash(key: :value), {key: :value})
+    assert_raise(TypeError) { Hash([1,2]) }
+    assert_raise(TypeError) { Hash(Object.new) }
+    o = Object.new
+    def o.to_hash; {a: 1, b: 2}; end
+    assert_equal(Hash(o), {a: 1, b: 2})
+    def o.to_hash; 9; end
+    assert_raise(TypeError) { Hash(o) }
+  end
+
   def test_to_integer
     o = Object.new
     def o.to_i; nil; end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]