Removed to_hash conversion method.

This commit is contained in:
Yukihiro "Matz" Matsumoto
2018-09-19 22:53:48 +09:00
parent 698f5f707c
commit 610bcc88c2
7 changed files with 37 additions and 89 deletions
+7 -23
View File
@@ -27,9 +27,9 @@ class Hash
length = object.length
if length == 1
o = object[0]
if o.respond_to?(:to_hash)
if Hash === o
h = self.new
object[0].to_hash.each { |k, v| h[k] = v }
o.each { |k, v| h[k] = v }
return h
elsif o.respond_to?(:to_a)
h = self.new
@@ -82,7 +82,7 @@ class Hash
#
def merge!(other, &block)
raise TypeError, "can't convert argument into Hash" unless other.respond_to?(:to_hash)
raise TypeError, "Hash required (#{other.class} given)" unless Hash === other
if block
other.each_key{|k|
self[k] = (self.has_key?(k))? block.call(k, self[k], other[k]): other[k]
@@ -310,11 +310,7 @@ class Hash
# h1 < h1 #=> false
#
def <(hash)
begin
hash = hash.to_hash
rescue NoMethodError
raise TypeError, "can't convert #{hash.class} to Hash"
end
raise TypeError, "can't convert #{hash.class} to Hash" unless Hash === hash
size < hash.size and all? {|key, val|
hash.key?(key) and hash[key] == val
}
@@ -334,11 +330,7 @@ class Hash
# h1 <= h1 #=> true
#
def <=(hash)
begin
hash = hash.to_hash
rescue NoMethodError
raise TypeError, "can't convert #{hash.class} to Hash"
end
raise TypeError, "can't convert #{hash.class} to Hash" unless Hash === hash
size <= hash.size and all? {|key, val|
hash.key?(key) and hash[key] == val
}
@@ -358,11 +350,7 @@ class Hash
# h1 > h1 #=> false
#
def >(hash)
begin
hash = hash.to_hash
rescue NoMethodError
raise TypeError, "can't convert #{hash.class} to Hash"
end
raise TypeError, "can't convert #{hash.class} to Hash" unless Hash === hash
size > hash.size and hash.all? {|key, val|
key?(key) and self[key] == val
}
@@ -382,11 +370,7 @@ class Hash
# h1 >= h1 #=> true
#
def >=(hash)
begin
hash = hash.to_hash
rescue NoMethodError
raise TypeError, "can't convert #{hash.class} to Hash"
end
raise TypeError, "can't convert #{hash.class} to Hash" unless Hash === hash
size >= hash.size and hash.all? {|key, val|
key?(key) and self[key] == val
}
+6 -14
View File
@@ -184,9 +184,9 @@ mrb_f_array(mrb_state *mrb, mrb_value self)
* 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>.
* Returns a <code>Hash</code> if <i>arg</i> is a <code>Hash</code>.
* Returns an empty <code>Hash</code> when <i>arg</i> is <tt>nil</tt>
* or <tt>[]</tt>.
*
* Hash([]) #=> {}
* Hash(nil) #=> {}
@@ -197,21 +197,13 @@ mrb_f_array(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_f_hash(mrb_state *mrb, mrb_value self)
{
mrb_value arg, tmp;
mrb_value arg;
mrb_get_args(mrb, "o", &arg);
if (mrb_nil_p(arg)) {
if (mrb_nil_p(arg) || (mrb_array_p(arg) && RARRAY_LEN(arg) == 0)) {
return mrb_hash_new(mrb);
}
tmp = mrb_check_convert_type(mrb, arg, MRB_TT_HASH, "Hash", "to_hash");
if (mrb_nil_p(tmp)) {
if (mrb_array_p(arg) && RARRAY_LEN(arg) == 0) {
return mrb_hash_new(mrb);
}
mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into Hash",
mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, arg)));
}
return tmp;
return mrb_ensure_hash_type(mrb, arg);
}
/*
+1 -1
View File
@@ -233,7 +233,7 @@ get_hash(mrb_state *mrb, mrb_value *hash, mrb_int argc, const mrb_value *argv)
if (argc != 2) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required");
}
tmp = mrb_check_convert_type(mrb, argv[1], MRB_TT_HASH, "Hash", "to_hash");
tmp = mrb_check_hash_type(mrb, argv[1]);
if (mrb_nil_p(tmp)) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required");
}
+4 -10
View File
@@ -12,9 +12,7 @@ class Hash
# ISO 15.2.13.4.1
def ==(hash)
return true if self.equal?(hash)
begin
hash = hash.to_hash
rescue NoMethodError
unless Hash === hash
return false
end
return false if self.size != hash.size
@@ -32,9 +30,7 @@ class Hash
# ISO 15.2.13.4.32 (x)
def eql?(hash)
return true if self.equal?(hash)
begin
hash = hash.to_hash
rescue NoMethodError
unless Hash === hash
return false
end
return false if self.size != hash.size
@@ -153,9 +149,8 @@ class Hash
#
# ISO 15.2.13.4.23
def replace(hash)
raise TypeError, "can't convert argument into Hash" unless hash.respond_to?(:to_hash)
raise TypeError, "Hash required (#{hash.class} given)" unless Hash === hash
self.clear
hash = hash.to_hash
hash.each_key{|k|
self[k] = hash[k]
}
@@ -178,8 +173,7 @@ class Hash
#
# ISO 15.2.13.4.22
def merge(other, &block)
raise TypeError, "can't convert argument into Hash" unless other.respond_to?(:to_hash)
other = other.to_hash
raise TypeError, "Hash required (#{other.class} given)" unless Hash === other
h = self.dup
if block
other.each_key{|k|
+2 -13
View File
@@ -492,18 +492,6 @@ mrb_notimplement_m(mrb_state *mrb, mrb_value self)
return mrb_nil_value();
}
static mrb_value
check_type(mrb_state *mrb, mrb_value val, enum mrb_vtype t, const char *c, const char *m)
{
mrb_value tmp;
tmp = mrb_check_convert_type(mrb, val, t, c, m);
if (mrb_nil_p(tmp)) {
mrb_raisef(mrb, E_TYPE_ERROR, "expected %S", mrb_str_new_cstr(mrb, c));
}
return tmp;
}
#define CHECK_TYPE(mrb, val, t, c) do { \
if (mrb_type(val) != (t)) {\
mrb_raisef(mrb, E_TYPE_ERROR, "expected %S", mrb_str_new_lit(mrb, c));\
@@ -527,7 +515,8 @@ to_ary(mrb_state *mrb, mrb_value val)
static mrb_value
to_hash(mrb_state *mrb, mrb_value val)
{
return check_type(mrb, val, MRB_TT_HASH, "Hash", "to_hash");
CHECK_TYPE(mrb, val, MRB_TT_HASH, "Hash");
return val;
}
#define to_sym(mrb, ss) mrb_obj_to_sym(mrb, ss)
-28
View File
@@ -738,18 +738,6 @@ mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val)
return;
}
MRB_API mrb_value
mrb_ensure_hash_type(mrb_state *mrb, mrb_value hash)
{
return mrb_convert_type(mrb, hash, MRB_TT_HASH, "Hash", "to_hash");
}
MRB_API mrb_value
mrb_check_hash_type(mrb_state *mrb, mrb_value hash)
{
return mrb_check_convert_type(mrb, hash, MRB_TT_HASH, "Hash", "to_hash");
}
static void
mrb_hash_modify(mrb_state *mrb, mrb_value hash)
{
@@ -1189,20 +1177,6 @@ mrb_hash_empty_m(mrb_state *mrb, mrb_value self)
return mrb_bool_value(mrb_hash_empty_p(mrb, self));
}
/* 15.2.13.4.29 (x)*/
/*
* call-seq:
* hsh.to_hash => hsh
*
* Returns +self+.
*/
static mrb_value
mrb_hash_to_hash(mrb_state *mrb, mrb_value hash)
{
return hash;
}
static int
hash_keys_i(mrb_state *mrb, mrb_value key, mrb_value val, void *p)
{
@@ -1439,6 +1413,4 @@ mrb_init_hash(mrb_state *mrb)
mrb_define_method(mrb, h, "value?", mrb_hash_has_value, MRB_ARGS_REQ(1)); /* 15.2.13.4.27 */
mrb_define_method(mrb, h, "values", mrb_hash_values, MRB_ARGS_NONE()); /* 15.2.13.4.28 */
mrb_define_method(mrb, h, "rehash", mrb_hash_rehash, MRB_ARGS_NONE());
mrb_define_method(mrb, h, "to_hash", mrb_hash_to_hash, MRB_ARGS_NONE()); /* 15.2.13.4.29 (x)*/
}
+17
View File
@@ -623,6 +623,23 @@ mrb_check_array_type(mrb_state *mrb, mrb_value ary)
return ary;
}
MRB_API mrb_value
mrb_ensure_hash_type(mrb_state *mrb, mrb_value hash)
{
if (!mrb_hash_p(hash)) {
mrb_raisef(mrb, E_TYPE_ERROR, "%S cannot be converted to Hash",
inspect_type(mrb, hash));
}
return hash;
}
MRB_API mrb_value
mrb_check_hash_type(mrb_state *mrb, mrb_value hash)
{
if (!mrb_hash_p(hash)) return mrb_nil_value();
return hash;
}
MRB_API mrb_value
mrb_inspect(mrb_state *mrb, mrb_value obj)
{