* hash.c (rb_hash_sort): remove hash specific implementation.

* hash.c (rb_hash_select): returns new hash, not assoc array.

* hash.c (env_select): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12582 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2007-06-21 14:50:14 +00:00
Родитель 967cca2f8d
Коммит 0bc84af1f9
2 изменённых файлов: 27 добавлений и 42 удалений

Просмотреть файл

@ -1,3 +1,14 @@
Thu Jun 21 20:36:12 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
* hash.c (rb_hash_sort): remove hash specific implementation.
Thu Jun 21 20:28:05 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
* hash.c (rb_hash_select): returns new hash, not assoc array.
[ruby-core:11504]
* hash.c (env_select): ditto.
Thu Jun 21 23:08:19 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
* parse.y (rb_intern2): ID_JUNK test based on len, not by NUL.

58
hash.c
Просмотреть файл

@ -734,15 +734,6 @@ rb_hash_reject(VALUE hash)
return rb_hash_delete_if(rb_obj_dup(hash));
}
static int
select_i(VALUE key, VALUE value, VALUE result)
{
if (key == Qundef) return ST_CONTINUE;
if (RTEST(rb_yield_values(2, key, value)))
rb_ary_push(result, rb_assoc_new(key, value));
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.values_at(key, ...) => array
@ -766,17 +757,24 @@ rb_hash_values_at(int argc, VALUE *argv, VALUE hash)
return result;
}
static int
select_i(VALUE key, VALUE value, VALUE result)
{
if (key == Qundef) return ST_CONTINUE;
if (RTEST(rb_yield_values(2, key, value)))
rb_hash_aset(result, key, value);
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.select {|key, value| block} => array
* hsh.select {|key, value| block} => a_hash
*
* Returns a new array consisting of <code>[key,value]</code>
* pairs for which the block returns true.
* Also see <code>Hash.values_at</code>.
* Returns a new hash consisting of entries which the block returns true.
*
* h = { "a" => 100, "b" => 200, "c" => 300 }
* h.select {|k,v| k > "a"} #=> [["b", 200], ["c", 300]]
* h.select {|k,v| v < 200} #=> [["a", 100]]
* h.select {|k,v| k > "a"} #=> {"b" => 200, "c" => 300}
* h.select {|k,v| v < 200} #=> {"a" => 100}
*/
VALUE
@ -785,7 +783,7 @@ rb_hash_select(VALUE hash)
VALUE result;
RETURN_ENUMERATOR(hash, 0, 0);
result = rb_ary_new();
result = rb_hash_new();
rb_hash_foreach(hash, select_i, result);
return result;
}
@ -1088,29 +1086,6 @@ rb_hash_to_a(VALUE hash)
return ary;
}
/*
* call-seq:
* hsh.sort => array
* hsh.sort {| a, b | block } => array
*
* Converts <i>hsh</i> to a nested array of <code>[</code> <i>key,
* value</i> <code>]</code> arrays and sorts it, using
* <code>Array#sort</code>.
*
* h = { "a" => 20, "b" => 30, "c" => 10 }
* h.sort #=> [["a", 20], ["b", 30], ["c", 10]]
* h.sort {|a,b| a[1]<=>b[1]} #=> [["c", 10], ["a", 20], ["b", 30]]
*
*/
static VALUE
rb_hash_sort(VALUE hash)
{
VALUE entries = rb_hash_to_a(hash);
rb_ary_sort_bang(entries);
return entries;
}
static int
inspect_i(VALUE key, VALUE value, VALUE str)
{
@ -2059,7 +2034,7 @@ env_select(VALUE ehash)
RETURN_ENUMERATOR(ehash, 0, 0);
rb_secure(4);
result = rb_ary_new();
result = rb_hash_new();
env = GET_ENVIRON(environ);
while (*env) {
char *s = strchr(*env, '=');
@ -2067,7 +2042,7 @@ env_select(VALUE ehash)
VALUE k = env_str_new(*env, s-*env);
VALUE v = env_str_new2(s+1);
if (RTEST(rb_yield_values(2, k, v))) {
rb_ary_push(result, rb_assoc_new(k, v));
rb_hash_aset(result, k, v);
}
}
env++;
@ -2415,7 +2390,6 @@ Init_Hash(void)
rb_define_method(rb_cHash,"each_value", rb_hash_each_value, 0);
rb_define_method(rb_cHash,"each_key", rb_hash_each_key, 0);
rb_define_method(rb_cHash,"each_pair", rb_hash_each_pair, 0);
rb_define_method(rb_cHash,"sort", rb_hash_sort, 0);
rb_define_method(rb_cHash,"keys", rb_hash_keys, 0);
rb_define_method(rb_cHash,"values", rb_hash_values, 0);