Class: Hash
Overview
A Hash is a dictionary-like collection of unique keys and their values. Also called associative arrays, they are similar to Arrays, but where an Array uses integers as its index, a Hash allows you to use any object type.
Hashes enumerate their values in the order that the corresponding keys were inserted.
A Hash can be easily created by using its implicit form:
grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
Hashes allow an alternate syntax form when your keys are always symbols. Instead of
= { :font_size => 10, :font_family => "Arial" }
You could write it as:
= { font_size: 10, font_family: "Arial" }
Each named key is a symbol you can access in hash:
[:font_size] # => 10
A Hash can also be created through its ::new method:
grades = Hash.new
grades["Dorothy Doe"] = 9
Hashes have a default value that is returned when accessing keys that do not exist in the hash. If no default is set nil
is used. You can set the default value by sending it as an argument to Hash.new:
grades = Hash.new(0)
Or by using the #default= method:
grades = {"Timmy Doe" => 8}
grades.default = 0
Accessing a value in a Hash requires using its key:
puts grades["Jane Doe"] # => 10
Common Uses
Hashes are an easy way to represent data structures, such as
books = {}
books[:matz] = "The Ruby Language"
books[:black] = "The Well-Grounded Rubyist"
Hashes are also commonly used as a way to have named parameters in functions. Note that no brackets are used below. If a hash is the last argument on a method call, no braces are needed, thus creating a really clean interface:
Person.create(name: "John Doe", age: 27)
def self.create(params)
@name = params[:name]
@age = params[:age]
end
Hash Keys
Two objects refer to the same hash key when their hash
value is identical and the two objects are eql?
to each other.
A user-defined class may be used as a hash key if the hash
and eql?
methods are overridden to provide meaningful behavior. By default, separate instances refer to separate hash keys.
A typical implementation of hash
is based on the object's data while eql?
is usually aliased to the overridden ==
method:
class Book
attr_reader :author, :title
def initialize(, title)
@author =
@title = title
end
def ==(other)
self.class === other and
other. == @author and
other.title == @title
end
alias eql? ==
def hash
@author.hash ^ @title.hash # XOR
end
end
book1 = Book.new 'matz', 'Ruby in a Nutshell'
book2 = Book.new 'matz', 'Ruby in a Nutshell'
reviews = {}
reviews[book1] = 'Great reference!'
reviews[book2] = 'Nice and compact!'
reviews.length #=> 1
See also Object#hash and Object#eql?
Class Method Summary collapse
-
.[] ⇒ Object
Creates a new hash populated with the given objects.
-
.try_convert(obj) ⇒ Hash?
Try to convert obj into a hash, using to_hash method.
Instance Method Summary collapse
-
#==(other_hash) ⇒ Boolean
Equality---Two hashes are equal if they each contain the same number of keys and if each key-value pair is equal to (according to
Object#==
) the corresponding elements in the other hash. -
#[](key) ⇒ Object
Element Reference---Retrieves the value object corresponding to the key object.
- #[]= ⇒ Object
-
#assoc(obj) ⇒ Array?
Searches through the hash comparing obj with the key using
==
. -
#clear ⇒ Hash
Removes all key-value pairs from hsh.
-
#compare_by_identity ⇒ Hash
Makes hsh compare its keys by their identity, i.e.
-
#compare_by_identity? ⇒ Boolean
Returns
true
if hsh will compare its keys by their identity. -
#default(key = nil) ⇒ Object
Returns the default value, the value that would be returned by hsh[key] if key did not exist in hsh.
-
#default=(obj) ⇒ Object
Sets the default value, the value returned for a key that does not exist in the hash.
-
#default_proc ⇒ Object
If
Hash::new
was invoked with a block, return that block, otherwise returnnil
. -
#default_proc=(proc_obj) ⇒ Object
Sets the default proc to be executed on each failed key lookup.
-
#delete ⇒ Object
Deletes the key-value pair and returns the value from hsh whose key is equal to key.
-
#delete_if ⇒ Object
Deletes every key-value pair from hsh for which block evaluates to
true
. -
#each ⇒ Object
Calls block once for each key in hsh, passing the key-value pair as parameters.
-
#each_key ⇒ Object
Calls block once for each key in hsh, passing the key as a parameter.
-
#each_pair ⇒ Object
Calls block once for each key in hsh, passing the key-value pair as parameters.
-
#each_value ⇒ Object
Calls block once for each key in hsh, passing the value as a parameter.
-
#empty? ⇒ Boolean
Returns
true
if hsh contains no key-value pairs. -
#eql?(other) ⇒ Boolean
Returns
true
if hash and other are both hashes with the same content. -
#fetch ⇒ Object
Returns a value from the hash for the given key.
-
#flatten ⇒ Object
Returns a new array that is a one-dimensional flattening of this hash.
-
#has_key? ⇒ Boolean
Returns
true
if the given key is present in hsh. -
#has_value? ⇒ Boolean
Returns
true
if the given value is present for some key in hsh. -
#hash ⇒ Fixnum
Compute a hash-code for this hash.
-
#include? ⇒ Boolean
Returns
true
if the given key is present in hsh. -
#index ⇒ Object
:nodoc:.
-
#initialize ⇒ Object
constructor
Returns a new, empty hash.
- #initialize_copy ⇒ Object
-
#inspect ⇒ Object
(also: #to_s)
Return the contents of this hash as a string.
-
#invert ⇒ Object
Returns a new hash created by using hsh's values as keys, and the keys as values.
-
#keep_if ⇒ Object
Deletes every key-value pair from hsh for which block evaluates to false.
-
#key(value) ⇒ Object
Returns the key of an occurrence of a given value.
-
#key? ⇒ Boolean
Returns
true
if the given key is present in hsh. -
#keys ⇒ Array
Returns a new array populated with the keys from this hash.
-
#length ⇒ Object
Returns the number of key-value pairs in the hash.
-
#member? ⇒ Boolean
Returns
true
if the given key is present in hsh. -
#merge ⇒ Object
Returns a new hash containing the contents of other_hash and the contents of hsh.
-
#merge! ⇒ Object
Adds the contents of other_hash to hsh.
-
#rassoc(obj) ⇒ Array?
Searches through the hash comparing obj with the value using
==
. -
#rehash ⇒ Hash
Rebuilds the hash based on the current hash values for each key.
-
#reject ⇒ Object
Same as
Hash#delete_if
, but works on (and returns) a copy of the hsh. -
#reject! ⇒ Object
Equivalent to
Hash#delete_if
, but returnsnil
if no changes were made. -
#replace(other_hash) ⇒ Hash
Replaces the contents of hsh with the contents of other_hash.
-
#select ⇒ Object
Returns a new hash consisting of entries for which the block returns true.
-
#select! ⇒ Object
Equivalent to
Hash#keep_if
, but returnsnil
if no changes were made. -
#shift ⇒ Array, Object
Removes a key-value pair from hsh and returns it as the two-item array
[
key, value]
, or the hash's default value if the hash is empty. -
#size ⇒ Object
Returns the number of key-value pairs in the hash.
- #store ⇒ Object
-
#to_a ⇒ Array
Converts hsh to a nested array of
[
key, value]
arrays. -
#to_h ⇒ Hash
Returns
self
. -
#to_hash ⇒ Hash
Returns
self
. -
#update ⇒ Object
Adds the contents of other_hash to hsh.
-
#value? ⇒ Boolean
Returns
true
if the given value is present for some key in hsh. -
#values ⇒ Array
Returns a new array populated with the values from hsh.
-
#values_at(key, ...) ⇒ Array
Return an array containing the values associated with the given keys.
Methods included from Enumerable
#all?, #any?, #chunk, #collect, #collect_concat, #count, #cycle, #detect, #drop, #drop_while, #each_cons, #each_entry, #each_slice, #each_with_index, #each_with_object, #entries, #find, #find_all, #find_index, #first, #flat_map, #grep, #group_by, #inject, #lazy, #map, #max, #max_by, #min, #min_by, #minmax, #minmax_by, #none?, #one?, #partition, #reduce, #reverse_each, #slice_before, #sort, #sort_by, #take, #take_while, #zip
Constructor Details
#new ⇒ Object #new(obj) ⇒ Object #new {|hash, key| ... } ⇒ Object
Returns a new, empty hash. If this hash is subsequently accessed by a key that doesn't correspond to a hash entry, the value returned depends on the style of new
used to create the hash. In the first form, the access returns nil
. If obj is specified, this single object will be used for all default values. If a block is specified, it will be called with the hash object and the key, and should return the default value. It is the block's responsibility to store the value in the hash if required.
h = Hash.new("Go Fish")
h["a"] = 100
h["b"] = 200
h["a"] #=> 100
h["c"] #=> "Go Fish"
# The following alters the single default object
h["c"].upcase! #=> "GO FISH"
h["d"] #=> "GO FISH"
h.keys #=> ["a", "b"]
# While this creates a new default object each time
h = Hash.new { |hash, key| hash[key] = "Go Fish: #{key}" }
h["c"] #=> "Go Fish: c"
h["c"].upcase! #=> "GO FISH: C"
h["d"] #=> "Go Fish: d"
h.keys #=> ["c", "d"]
351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 |
# File 'hash.c', line 351
static VALUE
rb_hash_initialize(int argc, VALUE *argv, VALUE hash)
{
VALUE ifnone;
rb_hash_modify(hash);
if (rb_block_given_p()) {
rb_check_arity(argc, 0, 0);
ifnone = rb_block_proc();
default_proc_arity_check(ifnone);
RHASH_IFNONE(hash) = ifnone;
FL_SET(hash, HASH_PROC_DEFAULT);
}
else {
rb_scan_args(argc, argv, "01", &ifnone);
RHASH_IFNONE(hash) = ifnone;
}
return hash;
}
|
Class Method Details
.[](key, value, ...) ⇒ Object .[]([ [key, value)) ⇒ Object .[](object) ⇒ Object
Creates a new hash populated with the given objects. Equivalent to the literal { key => value, ... }
. In the first form, keys and values occur in pairs, so there must be an even number of arguments. The second and third form take a single argument which is either an array of key-value pairs or an object convertible to a hash.
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}
Hash[ [ ["a", 100], ["b", 200] ] ] #=> {"a"=>100, "b"=>200}
Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200}
389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 |
# File 'hash.c', line 389
static VALUE
rb_hash_s_create(int argc, VALUE *argv, VALUE klass)
{
VALUE hash, tmp;
int i;
if (argc == 1) {
tmp = rb_hash_s_try_convert(Qnil, argv[0]);
if (!NIL_P(tmp)) {
hash = hash_alloc(klass);
if (RHASH(tmp)->ntbl) {
RHASH(hash)->ntbl = st_copy(RHASH(tmp)->ntbl);
}
return hash;
}
tmp = rb_check_array_type(argv[0]);
if (!NIL_P(tmp)) {
long i;
hash = hash_alloc(klass);
for (i = 0; i < RARRAY_LEN(tmp); ++i) {
VALUE e = RARRAY_PTR(tmp)[i];
VALUE v = rb_check_array_type(e);
VALUE key, val = Qnil;
if (NIL_P(v)) {
#if 0 /* refix in the next release */
rb_raise(rb_eArgError, "wrong element type %s at %ld (expected array)",
rb_builtin_class_name(e), i);
#else
rb_warn("wrong element type %s at %ld (expected array)",
rb_builtin_class_name(e), i);
rb_warn("ignoring wrong elements is deprecated, remove them explicitly");
rb_warn("this causes ArgumentError in the next release");
continue;
#endif
}
switch (RARRAY_LEN(v)) {
default:
rb_raise(rb_eArgError, "invalid number of elements (%ld for 1..2)",
RARRAY_LEN(v));
case 2:
val = RARRAY_PTR(v)[1];
case 1:
key = RARRAY_PTR(v)[0];
rb_hash_aset(hash, key, val);
}
}
return hash;
}
}
if (argc % 2 != 0) {
rb_raise(rb_eArgError, "odd number of arguments for Hash");
}
hash = hash_alloc(klass);
for (i=0; i<argc; i+=2) {
rb_hash_aset(hash, argv[i], argv[i + 1]);
}
return hash;
}
|
.try_convert(obj) ⇒ Hash?
477 478 479 480 481 |
# File 'hash.c', line 477
static VALUE
rb_hash_s_try_convert(VALUE dummy, VALUE hash)
{
return rb_check_hash_type(hash);
}
|
Instance Method Details
#==(other_hash) ⇒ Boolean
Equality---Two hashes are equal if they each contain the same number of keys and if each key-value pair is equal to (according to Object#==
) the corresponding elements in the other hash.
h1 = { "a" => 1, "c" => 2 }
h2 = { 7 => 35, "c" => 2, "a" => 1 }
h3 = { "a" => 1, "c" => 2, 7 => 35 }
h4 = { "a" => 1, "d" => 2, "f" => 35 }
h1 == h2 #=> false
h2 == h3 #=> true
h3 == h4 #=> false
1748 1749 1750 1751 1752 |
# File 'hash.c', line 1748
static VALUE
rb_hash_equal(VALUE hash1, VALUE hash2)
{
return hash_equal(hash1, hash2, FALSE);
}
|
#[](key) ⇒ Object
Element Reference---Retrieves the value object corresponding to the key object. If not found, returns the default value (see Hash::new
for details).
h = { "a" => 100, "b" => 200 }
h["a"] #=> 100
h["c"] #=> nil
559 560 561 562 563 564 565 566 567 568 |
# File 'hash.c', line 559
VALUE
rb_hash_aref(VALUE hash, VALUE key)
{
st_data_t val;
if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) {
return hash_default_value(hash, key);
}
return (VALUE)val;
}
|
#[]= ⇒ Object
#assoc(obj) ⇒ Array?
Searches through the hash comparing obj with the key using ==
. Returns the key-value pair (two elements array) or nil
if no match is found. See Array#assoc
.
h = {"colors" => ["red", "blue", "green"],
"letters" => ["a", "b", "c" ]}
h.assoc("letters") #=> ["letters", ["a", "b", "c"]]
h.assoc("foo") #=> nil
2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 |
# File 'hash.c', line 2012
VALUE
rb_hash_assoc(VALUE hash, VALUE obj)
{
VALUE args[2];
args[0] = obj;
args[1] = Qnil;
rb_hash_foreach(hash, assoc_i, (VALUE)args);
return args[1];
}
|
#clear ⇒ Hash
Removes all key-value pairs from hsh.
h = { "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200}
h.clear #=> {}
1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 |
# File 'hash.c', line 1137
VALUE
rb_hash_clear(VALUE hash)
{
rb_hash_modify_check(hash);
if (!RHASH(hash)->ntbl)
return hash;
if (RHASH(hash)->ntbl->num_entries > 0) {
if (RHASH_ITER_LEV(hash) > 0)
rb_hash_foreach(hash, clear_i, 0);
else
st_clear(RHASH(hash)->ntbl);
}
return hash;
}
|
#compare_by_identity ⇒ Hash
Makes hsh compare its keys by their identity, i.e. it will consider exact same objects as same keys.
h1 = { "a" => 100, "b" => 200, :c => "c" }
h1["a"] #=> 100
h1.compare_by_identity
h1.compare_by_identity? #=> true
h1["a"] #=> nil # different objects.
h1[:c] #=> "c" # same symbols are all same.
2106 2107 2108 2109 2110 2111 2112 2113 |
# File 'hash.c', line 2106
static VALUE
rb_hash_compare_by_id(VALUE hash)
{
rb_hash_modify(hash);
RHASH(hash)->ntbl->type = &identhash;
rb_hash_rehash(hash);
return hash;
}
|
#compare_by_identity? ⇒ Boolean
Returns true
if hsh will compare its keys by their identity. Also see Hash#compare_by_identity
.
2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 |
# File 'hash.c', line 2124
static VALUE
rb_hash_compare_by_id_p(VALUE hash)
{
if (!RHASH(hash)->ntbl)
return Qfalse;
if (RHASH(hash)->ntbl->type == &identhash) {
return Qtrue;
}
return Qfalse;
}
|
#default(key = nil) ⇒ Object
Returns the default value, the value that would be returned by hsh[key] if key did not exist in hsh. See also Hash::new
and Hash#default=
.
h = Hash.new #=> {}
h.default #=> nil
h.default(2) #=> nil
h = Hash.new("cat") #=> {}
h.default #=> "cat"
h.default(2) #=> "cat"
h = Hash.new {|h,k| h[k] = k.to_i*10} #=> {}
h.default #=> nil
h.default(2) #=> 20
671 672 673 674 675 676 677 678 679 680 681 682 683 |
# File 'hash.c', line 671
static VALUE
rb_hash_default(int argc, VALUE *argv, VALUE hash)
{
VALUE key, ifnone;
rb_scan_args(argc, argv, "01", &key);
ifnone = RHASH_IFNONE(hash);
if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
if (argc == 0) return Qnil;
return rb_funcall(ifnone, id_yield, 2, hash, key);
}
return ifnone;
}
|
#default=(obj) ⇒ Object
Sets the default value, the value returned for a key that does not exist in the hash. It is not possible to set the default to a Proc
that will be executed on each key lookup.
h = { "a" => 100, "b" => 200 }
h.default = "Go fish"
h["a"] #=> 100
h["z"] #=> "Go fish"
# This doesn't do what you might hope...
h.default = proc do |hash, key|
hash[key] = key + key
end
h[2] #=> #<Proc:0x401b3948@-:6>
h["cat"] #=> #<Proc:0x401b3948@-:6>
705 706 707 708 709 710 711 712 |
# File 'hash.c', line 705
static VALUE
rb_hash_set_default(VALUE hash, VALUE ifnone)
{
rb_hash_modify_check(hash);
RHASH_IFNONE(hash) = ifnone;
FL_UNSET(hash, HASH_PROC_DEFAULT);
return ifnone;
}
|
#default_proc ⇒ Object
729 730 731 732 733 734 735 736 |
# File 'hash.c', line 729
static VALUE
rb_hash_default_proc(VALUE hash)
{
if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
return RHASH_IFNONE(hash);
}
return Qnil;
}
|
#default_proc=(proc_obj) ⇒ Object
Sets the default proc to be executed on each failed key lookup.
h.default_proc = proc do |hash, key|
hash[key] = key + key
end
h[2] #=> 4
h["cat"] #=> "catcat"
751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 |
# File 'hash.c', line 751
static VALUE
rb_hash_set_default_proc(VALUE hash, VALUE proc)
{
VALUE b;
rb_hash_modify_check(hash);
if (NIL_P(proc)) {
FL_UNSET(hash, HASH_PROC_DEFAULT);
RHASH_IFNONE(hash) = proc;
return proc;
}
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;
default_proc_arity_check(proc);
RHASH_IFNONE(hash) = proc;
FL_SET(hash, HASH_PROC_DEFAULT);
return proc;
}
|
#delete(key) ⇒ Object #delete(key) {|key| ... } ⇒ Object
Deletes the key-value pair and returns the value from hsh whose key is equal to key. If the key is not found, returns the default value. If the optional code block is given and the key is not found, pass in the key and return the result of block.
h = { "a" => 100, "b" => 200 }
h.delete("a") #=> 100
h.delete("z") #=> nil
h.delete("z") { |el| "#{el} not found" } #=> "z not found"
858 859 860 861 862 863 864 865 866 867 868 869 870 |
# File 'hash.c', line 858
VALUE
rb_hash_delete(VALUE hash, VALUE key)
{
VALUE val;
rb_hash_modify_check(hash);
val = rb_hash_delete_key(hash, key);
if (val != Qundef) return val;
if (rb_block_given_p()) {
return rb_yield(key);
}
return Qnil;
}
|
#delete_if {|key, value| ... } ⇒ Hash #delete_if ⇒ Object
Deletes every key-value pair from hsh for which block evaluates to true
.
If no block is given, an enumerator is returned instead.
h = { "a" => 100, "b" => 200, "c" => 300 }
h.delete_if {|key, value| key >= "b" } #=> {"a"=>100}
958 959 960 961 962 963 964 965 966 |
# File 'hash.c', line 958
VALUE
rb_hash_delete_if(VALUE hash)
{
RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size);
rb_hash_modify_check(hash);
if (RHASH(hash)->ntbl)
rb_hash_foreach(hash, delete_if_i, hash);
return hash;
}
|
#each {|key, value| ... } ⇒ Hash #each_pair {|key, value| ... } ⇒ Hash #each ⇒ Object #each_pair ⇒ Object
Calls block once for each key in hsh, passing the key-value pair as parameters.
If no block is given, an enumerator is returned instead.
h = { "a" => 100, "b" => 200 }
h.each {|key, value| puts "#{key} is #{value}" }
produces:
a is 100
b is 200
1409 1410 1411 1412 1413 1414 1415 |
# File 'hash.c', line 1409
static VALUE
rb_hash_each_pair(VALUE hash)
{
RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size);
rb_hash_foreach(hash, each_pair_i, 0);
return hash;
}
|
#each_key {|key| ... } ⇒ Hash #each_key ⇒ Object
Calls block once for each key in hsh, passing the key as a parameter.
If no block is given, an enumerator is returned instead.
h = { "a" => 100, "b" => 200 }
h.each_key {|key| puts key }
produces:
a
b
1372 1373 1374 1375 1376 1377 1378 |
# File 'hash.c', line 1372
static VALUE
rb_hash_each_key(VALUE hash)
{
RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size);
rb_hash_foreach(hash, each_key_i, 0);
return hash;
}
|
#each {|key, value| ... } ⇒ Hash #each_pair {|key, value| ... } ⇒ Hash #each ⇒ Object #each_pair ⇒ Object
Calls block once for each key in hsh, passing the key-value pair as parameters.
If no block is given, an enumerator is returned instead.
h = { "a" => 100, "b" => 200 }
h.each {|key, value| puts "#{key} is #{value}" }
produces:
a is 100
b is 200
1409 1410 1411 1412 1413 1414 1415 |
# File 'hash.c', line 1409
static VALUE
rb_hash_each_pair(VALUE hash)
{
RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size);
rb_hash_foreach(hash, each_pair_i, 0);
return hash;
}
|
#each_value {|value| ... } ⇒ Hash #each_value ⇒ Object
Calls block once for each key in hsh, passing the value as a parameter.
If no block is given, an enumerator is returned instead.
h = { "a" => 100, "b" => 200 }
h.each_value {|value| puts value }
produces:
100
200
1339 1340 1341 1342 1343 1344 1345 |
# File 'hash.c', line 1339
static VALUE
rb_hash_each_value(VALUE hash)
{
RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size);
rb_hash_foreach(hash, each_value_i, 0);
return hash;
}
|
#empty? ⇒ Boolean
Returns true
if hsh contains no key-value pairs.
{}.empty? #=> true
1307 1308 1309 1310 1311 |
# File 'hash.c', line 1307
static VALUE
rb_hash_empty_p(VALUE hash)
{
return RHASH_EMPTY_P(hash) ? Qtrue : Qfalse;
}
|
#eql?(other) ⇒ Boolean
Returns true
if hash and other are both hashes with the same content.
1762 1763 1764 1765 1766 |
# File 'hash.c', line 1762
static VALUE
rb_hash_eql(VALUE hash1, VALUE hash2)
{
return hash_equal(hash1, hash2, TRUE);
}
|
#fetch(key[, default]) ⇒ Object #fetch(key) {|key| ... } ⇒ Object
Returns a value from the hash for the given key. If the key can't be found, there are several options: With no other arguments, it will raise an KeyError
exception; if default is given, then that will be returned; if the optional code block is specified, then that will be run and its result returned.
h = { "a" => 100, "b" => 200 }
h.fetch("a") #=> 100
h.fetch("z", "go fish") #=> "go fish"
h.fetch("z") { |el| "go fish, #{el}"} #=> "go fish, z"
The following example shows that an exception is raised if the key is not found and a default value is not supplied.
h = { "a" => 100, "b" => 200 }
h.fetch("z")
produces:
prog.rb:2:in `fetch': key not found (KeyError)
from prog.rb:2
616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 |
# File 'hash.c', line 616
static VALUE
rb_hash_fetch_m(int argc, VALUE *argv, VALUE hash)
{
VALUE key, if_none;
st_data_t val;
long block_given;
rb_scan_args(argc, argv, "11", &key, &if_none);
block_given = rb_block_given_p();
if (block_given && argc == 2) {
rb_warn("block supersedes default value argument");
}
if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) {
if (block_given) return rb_yield(key);
if (argc == 1) {
volatile VALUE desc = rb_protect(rb_inspect, key, 0);
if (NIL_P(desc)) {
desc = rb_any_to_s(key);
}
desc = rb_str_ellipsize(desc, 65);
rb_raise(rb_eKeyError, "key not found: %s", RSTRING_PTR(desc));
}
return if_none;
}
return (VALUE)val;
}
|
#flatten ⇒ Array #flatten(level) ⇒ Array
Returns a new array that is a one-dimensional flattening of this hash. That is, for every key or value that is an array, extract its elements into the new array. Unlike Array#flatten, this method does not flatten recursively by default. The optional level argument determines the level of recursion to flatten.
a = {1=> "one", 2 => [2,"two"], 3 => "three"}
a.flatten # => [1, "one", 2, [2, "two"], 3, "three"]
a.flatten(2) # => [1, "one", 2, 2, "two", 3, "three"]
2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 |
# File 'hash.c', line 2075
static VALUE
rb_hash_flatten(int argc, VALUE *argv, VALUE hash)
{
VALUE ary, tmp;
ary = rb_hash_to_a(hash);
if (argc == 0) {
argc = 1;
tmp = INT2FIX(1);
argv = &tmp;
}
rb_funcall2(ary, rb_intern("flatten!"), argc, argv);
return ary;
}
|
#has_key?(key) ⇒ Boolean #include?(key) ⇒ Boolean #key?(key) ⇒ Boolean #member?(key) ⇒ Boolean
Returns true
if the given key is present in hsh.
h = { "a" => 100, "b" => 200 }
h.has_key?("a") #=> true
h.has_key?("z") #=> false
1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 |
# File 'hash.c', line 1614
static VALUE
rb_hash_has_key(VALUE hash, VALUE key)
{
if (!RHASH(hash)->ntbl)
return Qfalse;
if (st_lookup(RHASH(hash)->ntbl, key, 0)) {
return Qtrue;
}
return Qfalse;
}
|
#has_value?(value) ⇒ Boolean #value?(value) ⇒ Boolean
Returns true
if the given value is present for some key in hsh.
h = { "a" => 100, "b" => 200 }
h.has_value?(100) #=> true
h.has_value?(999) #=> false
1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 |
# File 'hash.c', line 1650
static VALUE
rb_hash_has_value(VALUE hash, VALUE val)
{
VALUE data[2];
data[0] = Qfalse;
data[1] = val;
rb_hash_foreach(hash, rb_hash_search_value, (VALUE)data);
return data[0];
}
|
#hash ⇒ Fixnum
Compute a hash-code for this hash. Two hashes with the same content will have the same hash code (and will compare using eql?
).
1805 1806 1807 1808 1809 |
# File 'hash.c', line 1805
static VALUE
rb_hash_hash(VALUE hash)
{
return rb_exec_recursive_outer(recursive_hash, hash, 0);
}
|
#has_key?(key) ⇒ Boolean #include?(key) ⇒ Boolean #key?(key) ⇒ Boolean #member?(key) ⇒ Boolean
Returns true
if the given key is present in hsh.
h = { "a" => 100, "b" => 200 }
h.has_key?("a") #=> true
h.has_key?("z") #=> false
1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 |
# File 'hash.c', line 1614
static VALUE
rb_hash_has_key(VALUE hash, VALUE key)
{
if (!RHASH(hash)->ntbl)
return Qfalse;
if (st_lookup(RHASH(hash)->ntbl, key, 0)) {
return Qtrue;
}
return Qfalse;
}
|
#index ⇒ Object
:nodoc:
815 816 817 818 819 820 |
# File 'hash.c', line 815
static VALUE
rb_hash_index(VALUE hash, VALUE value)
{
rb_warn("Hash#index is deprecated; use Hash#key");
return rb_hash_key(hash, value);
}
|
#initialize_copy ⇒ Object
1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 |
# File 'hash.c', line 1216
static VALUE
rb_hash_initialize_copy(VALUE hash, VALUE hash2)
{
rb_hash_modify_check(hash);
hash2 = to_hash(hash2);
Check_Type(hash2, T_HASH);
if (!RHASH_EMPTY_P(hash2)) {
RHASH(hash)->ntbl = st_copy(RHASH(hash2)->ntbl);
rb_hash_rehash(hash);
}
if (FL_TEST(hash2, HASH_PROC_DEFAULT)) {
FL_SET(hash, HASH_PROC_DEFAULT);
}
else {
FL_UNSET(hash, HASH_PROC_DEFAULT);
}
RHASH_IFNONE(hash) = RHASH_IFNONE(hash2);
return hash;
}
|
#to_s ⇒ String #inspect ⇒ String Also known as: to_s
Return the contents of this hash as a string.
h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 }
h.to_s #=> "{\"c\"=>300, \"a\"=>100, \"d\"=>400}"
1494 1495 1496 1497 1498 1499 1500 |
# File 'hash.c', line 1494
static VALUE
rb_hash_inspect(VALUE hash)
{
if (RHASH_EMPTY_P(hash))
return rb_usascii_str_new2("{}");
return rb_exec_recursive(inspect_hash, hash, 0);
}
|
#invert ⇒ Object
Returns a new hash created by using hsh's values as keys, and the keys as values.
h = { "n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0 }
h.invert #=> {0=>"a", 100=>"m", 200=>"d", 300=>"y"}
1830 1831 1832 1833 1834 1835 1836 1837 |
# File 'hash.c', line 1830
static VALUE
rb_hash_invert(VALUE hash)
{
VALUE h = rb_hash_new();
rb_hash_foreach(hash, rb_hash_invert_i, h);
return h;
}
|
#keep_if {|key, value| ... } ⇒ Hash #keep_if ⇒ Object
Deletes every key-value pair from hsh for which block evaluates to false.
If no block is given, an enumerator is returned instead.
1110 1111 1112 1113 1114 1115 1116 1117 1118 |
# File 'hash.c', line 1110
VALUE
rb_hash_keep_if(VALUE hash)
{
RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size);
rb_hash_modify_check(hash);
if (RHASH(hash)->ntbl)
rb_hash_foreach(hash, keep_if_i, hash);
return hash;
}
|
#key(value) ⇒ Object
Returns the key of an occurrence of a given value. If the value is not found, returns nil
.
h = { "a" => 100, "b" => 200, "c" => 300, "d" => 300 }
h.key(200) #=> "b"
h.key(300) #=> "c"
h.key(999) #=> nil
801 802 803 804 805 806 807 808 809 810 811 812 |
# File 'hash.c', line 801
static VALUE
rb_hash_key(VALUE hash, VALUE value)
{
VALUE args[2];
args[0] = value;
args[1] = Qnil;
rb_hash_foreach(hash, key_i, (VALUE)args);
return args[1];
}
|
#has_key?(key) ⇒ Boolean #include?(key) ⇒ Boolean #key?(key) ⇒ Boolean #member?(key) ⇒ Boolean
Returns true
if the given key is present in hsh.
h = { "a" => 100, "b" => 200 }
h.has_key?("a") #=> true
h.has_key?("z") #=> false
1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 |
# File 'hash.c', line 1614
static VALUE
rb_hash_has_key(VALUE hash, VALUE key)
{
if (!RHASH(hash)->ntbl)
return Qfalse;
if (st_lookup(RHASH(hash)->ntbl, key, 0)) {
return Qtrue;
}
return Qfalse;
}
|
#keys ⇒ Array
Returns a new array populated with the keys from this hash. See also Hash#values
.
h = { "a" => 100, "b" => 200, "c" => 300, "d" => 400 }
h.keys #=> ["a", "b", "c", "d"]
1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 |
# File 'hash.c', line 1558
static VALUE
rb_hash_keys(VALUE hash)
{
VALUE ary;
ary = rb_ary_new();
rb_hash_foreach(hash, keys_i, ary);
return ary;
}
|
#length ⇒ Fixnum #size ⇒ Fixnum
Returns the number of key-value pairs in the hash.
h = { "d" => 100, "a" => 200, "v" => 300, "e" => 400 }
h.length #=> 4
h.delete("a") #=> 200
h.length #=> 3
1288 1289 1290 1291 1292 1293 1294 |
# File 'hash.c', line 1288
static VALUE
rb_hash_size(VALUE hash)
{
if (!RHASH(hash)->ntbl)
return INT2FIX(0);
return INT2FIX(RHASH(hash)->ntbl->num_entries);
}
|
#has_key?(key) ⇒ Boolean #include?(key) ⇒ Boolean #key?(key) ⇒ Boolean #member?(key) ⇒ Boolean
Returns true
if the given key is present in hsh.
h = { "a" => 100, "b" => 200 }
h.has_key?("a") #=> true
h.has_key?("z") #=> false
1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 |
# File 'hash.c', line 1614
static VALUE
rb_hash_has_key(VALUE hash, VALUE key)
{
if (!RHASH(hash)->ntbl)
return Qfalse;
if (st_lookup(RHASH(hash)->ntbl, key, 0)) {
return Qtrue;
}
return Qfalse;
}
|
#merge(other_hash) ⇒ Object #merge(other_hash) {|key, oldval, newval| ... } ⇒ Object
Returns a new hash containing the contents of other_hash and the contents of hsh. If no block is specified, the value for entries with duplicate keys will be that of other_hash. Otherwise the value for each duplicate key is determined by calling the block with the key, its value in hsh and its value in other_hash.
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h1.merge(h2) #=> {"a"=>100, "b"=>254, "c"=>300}
h1.merge(h2){|key, oldval, newval| newval - oldval}
#=> {"a"=>100, "b"=>54, "c"=>300}
h1 #=> {"a"=>100, "b"=>200}
1980 1981 1982 1983 1984 |
# File 'hash.c', line 1980
static VALUE
rb_hash_merge(VALUE hash1, VALUE hash2)
{
return rb_hash_update(rb_obj_dup(hash1), hash2);
}
|
#merge!(other_hash) ⇒ Hash #update(other_hash) ⇒ Hash #merge!(other_hash) {|key, oldval, newval| ... } ⇒ Hash #update(other_hash) {|key, oldval, newval| ... } ⇒ Hash
Adds the contents of other_hash to hsh. If no block is specified, entries with duplicate keys are overwritten with the values from other_hash, otherwise the value of each duplicate key is determined by calling the block with the key, its value in hsh and its value in other_hash.
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h1.merge!(h2) #=> {"a"=>100, "b"=>254, "c"=>300}
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h1.merge!(h2) { |key, v1, v2| v1 }
#=> {"a"=>100, "b"=>200, "c"=>300}
1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 |
# File 'hash.c', line 1898
static VALUE
rb_hash_update(VALUE hash1, VALUE hash2)
{
rb_hash_modify(hash1);
hash2 = to_hash(hash2);
if (rb_block_given_p()) {
rb_hash_foreach(hash2, rb_hash_update_block_i, hash1);
}
else {
rb_hash_foreach(hash2, rb_hash_update_i, hash1);
}
return hash1;
}
|
#rassoc(obj) ⇒ Array?
Searches through the hash comparing obj with the value using ==
. Returns the first key-value pair (two-element array) that matches. See also Array#rassoc
.
a = {1=> "one", 2 => "two", 3 => "three", "ii" => "two"}
a.rassoc("two") #=> [2, "two"]
a.rassoc("four") #=> nil
2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 |
# File 'hash.c', line 2048
VALUE
rb_hash_rassoc(VALUE hash, VALUE obj)
{
VALUE args[2];
args[0] = obj;
args[1] = Qnil;
rb_hash_foreach(hash, rassoc_i, (VALUE)args);
return args[1];
}
|
#rehash ⇒ Hash
Rebuilds the hash based on the current hash values for each key. If values of key objects have changed since they were inserted, this method will reindex hsh. If Hash#rehash
is called while an iterator is traversing the hash, an RuntimeError
will be raised in the iterator.
a = [ "a", "b" ]
c = [ "c", "d" ]
h = { a => 100, c => 300 }
h[a] #=> 100
a[0] = "z"
h[a] #=> nil
h.rehash #=> {["z", "b"]=>100, ["c", "d"]=>300}
h[a] #=> 100
512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 |
# File 'hash.c', line 512
static VALUE
rb_hash_rehash(VALUE hash)
{
st_table *tbl;
if (RHASH_ITER_LEV(hash) > 0) {
rb_raise(rb_eRuntimeError, "rehash during iteration");
}
rb_hash_modify_check(hash);
if (!RHASH(hash)->ntbl)
return hash;
tbl = st_init_table_with_size(RHASH(hash)->ntbl->type, RHASH(hash)->ntbl->num_entries);
rb_hash_foreach(hash, rb_hash_rehash_i, (VALUE)tbl);
st_free_table(RHASH(hash)->ntbl);
RHASH(hash)->ntbl = tbl;
return hash;
}
|
#reject {|key, value| ... } ⇒ Hash #reject ⇒ Object
Same as Hash#delete_if
, but works on (and returns) a copy of the hsh. Equivalent to hsh.dup.delete_if
.
1003 1004 1005 1006 1007 |
# File 'hash.c', line 1003
static VALUE
rb_hash_reject(VALUE hash)
{
return rb_hash_delete_if(rb_obj_dup(hash));
}
|
#reject! {|key, value| ... } ⇒ Hash? #reject! ⇒ Object
Equivalent to Hash#delete_if
, but returns nil
if no changes were made.
977 978 979 980 981 982 983 984 985 986 987 988 989 990 |
# File 'hash.c', line 977
VALUE
rb_hash_reject_bang(VALUE hash)
{
st_index_t n;
RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size);
rb_hash_modify(hash);
if (!RHASH(hash)->ntbl)
return Qnil;
n = RHASH(hash)->ntbl->num_entries;
rb_hash_foreach(hash, delete_if_i, hash);
if (n == RHASH(hash)->ntbl->num_entries) return Qnil;
return hash;
}
|
#replace(other_hash) ⇒ Hash
Replaces the contents of hsh with the contents of other_hash.
h = { "a" => 100, "b" => 200 }
h.replace({ "c" => 300, "d" => 400 }) #=> {"c"=>300, "d"=>400}
1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 |
# File 'hash.c', line 1252
static VALUE
rb_hash_replace(VALUE hash, VALUE hash2)
{
rb_hash_modify_check(hash);
hash2 = to_hash(hash2);
if (hash == hash2) return hash;
rb_hash_clear(hash);
if (RHASH(hash2)->ntbl) {
rb_hash_tbl(hash);
RHASH(hash)->ntbl->type = RHASH(hash2)->ntbl->type;
}
rb_hash_foreach(hash2, replace_i, hash);
RHASH_IFNONE(hash) = RHASH_IFNONE(hash2);
if (FL_TEST(hash2, HASH_PROC_DEFAULT)) {
FL_SET(hash, HASH_PROC_DEFAULT);
}
else {
FL_UNSET(hash, HASH_PROC_DEFAULT);
}
return hash;
}
|
#select {|key, value| ... } ⇒ Hash #select ⇒ Object
Returns a new hash consisting of entries for which the block returns true.
If no block is given, an enumerator is returned instead.
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}
1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 |
# File 'hash.c', line 1054
VALUE
rb_hash_select(VALUE hash)
{
VALUE result;
RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size);
result = rb_hash_new();
rb_hash_foreach(hash, select_i, result);
return result;
}
|
#select! {|key, value| ... } ⇒ Hash? #select! ⇒ Object
Equivalent to Hash#keep_if
, but returns nil
if no changes were made.
1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 |
# File 'hash.c', line 1083
VALUE
rb_hash_select_bang(VALUE hash)
{
st_index_t n;
RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size);
rb_hash_modify_check(hash);
if (!RHASH(hash)->ntbl)
return Qnil;
n = RHASH(hash)->ntbl->num_entries;
rb_hash_foreach(hash, keep_if_i, hash);
if (n == RHASH(hash)->ntbl->num_entries) return Qnil;
return hash;
}
|
#shift ⇒ Array, Object
Removes a key-value pair from hsh and returns it as the two-item array [
key, value ]
, or the hash's default value if the hash is empty.
h = { 1 => "a", 2 => "b", 3 => "c" }
h.shift #=> [1, "a"]
h #=> {2=>"b", 3=>"c"}
911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 |
# File 'hash.c', line 911
static VALUE
rb_hash_shift(VALUE hash)
{
struct shift_var var;
rb_hash_modify_check(hash);
if (RHASH(hash)->ntbl) {
var.key = Qundef;
rb_hash_foreach(hash, RHASH_ITER_LEV(hash) > 0 ? shift_i_safe : shift_i,
(VALUE)&var);
if (var.key != Qundef) {
if (RHASH_ITER_LEV(hash) > 0) {
rb_hash_delete_key(hash, var.key);
}
return rb_assoc_new(var.key, var.val);
}
}
return hash_default_value(hash, Qnil);
}
|
#length ⇒ Fixnum #size ⇒ Fixnum
Returns the number of key-value pairs in the hash.
h = { "d" => 100, "a" => 200, "v" => 300, "e" => 400 }
h.length #=> 4
h.delete("a") #=> 200
h.length #=> 3
1288 1289 1290 1291 1292 1293 1294 |
# File 'hash.c', line 1288
static VALUE
rb_hash_size(VALUE hash)
{
if (!RHASH(hash)->ntbl)
return INT2FIX(0);
return INT2FIX(RHASH(hash)->ntbl->num_entries);
}
|
#store ⇒ Object
#to_a ⇒ Array
Converts hsh to a nested array of [
key, value ]
arrays.
h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 }
h.to_a #=> [["c", 300], ["a", 100], ["d", 400]]
1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 |
# File 'hash.c', line 1435
static VALUE
rb_hash_to_a(VALUE hash)
{
VALUE ary;
ary = rb_ary_new();
rb_hash_foreach(hash, to_a_i, ary);
OBJ_INFECT(ary, hash);
return ary;
}
|
#to_h ⇒ Hash
Returns self
. If called on a subclass of Hash, converts the receiver to a Hash object.
1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 |
# File 'hash.c', line 1523
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;
}
|
#to_hash ⇒ Hash
Returns self
.
1509 1510 1511 1512 1513 |
# File 'hash.c', line 1509
static VALUE
rb_hash_to_hash(VALUE hash)
{
return hash;
}
|
#merge!(other_hash) ⇒ Hash #update(other_hash) ⇒ Hash #merge!(other_hash) {|key, oldval, newval| ... } ⇒ Hash #update(other_hash) {|key, oldval, newval| ... } ⇒ Hash
Adds the contents of other_hash to hsh. If no block is specified, entries with duplicate keys are overwritten with the values from other_hash, otherwise the value of each duplicate key is determined by calling the block with the key, its value in hsh and its value in other_hash.
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h1.merge!(h2) #=> {"a"=>100, "b"=>254, "c"=>300}
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h1.merge!(h2) { |key, v1, v2| v1 }
#=> {"a"=>100, "b"=>200, "c"=>300}
1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 |
# File 'hash.c', line 1898
static VALUE
rb_hash_update(VALUE hash1, VALUE hash2)
{
rb_hash_modify(hash1);
hash2 = to_hash(hash2);
if (rb_block_given_p()) {
rb_hash_foreach(hash2, rb_hash_update_block_i, hash1);
}
else {
rb_hash_foreach(hash2, rb_hash_update_i, hash1);
}
return hash1;
}
|
#has_value?(value) ⇒ Boolean #value?(value) ⇒ Boolean
Returns true
if the given value is present for some key in hsh.
h = { "a" => 100, "b" => 200 }
h.has_value?(100) #=> true
h.has_value?(999) #=> false
1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 |
# File 'hash.c', line 1650
static VALUE
rb_hash_has_value(VALUE hash, VALUE val)
{
VALUE data[2];
data[0] = Qfalse;
data[1] = val;
rb_hash_foreach(hash, rb_hash_search_value, (VALUE)data);
return data[0];
}
|
#values ⇒ Array
Returns a new array populated with the values from hsh. See also Hash#keys
.
h = { "a" => 100, "b" => 200, "c" => 300 }
h.values #=> [100, 200, 300]
1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 |
# File 'hash.c', line 1588
static VALUE
rb_hash_values(VALUE hash)
{
VALUE ary;
ary = rb_ary_new();
rb_hash_foreach(hash, values_i, ary);
return ary;
}
|
#values_at(key, ...) ⇒ Array
Return an array containing the values associated with the given keys. Also see Hash.select
.
h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" }
h.values_at("cow", "cat") #=> ["bovine", "feline"]
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 |
# File 'hash.c', line 1020
VALUE
rb_hash_values_at(int argc, VALUE *argv, VALUE hash)
{
VALUE result = rb_ary_new2(argc);
long i;
for (i=0; i<argc; i++) {
rb_ary_push(result, rb_hash_aref(hash, argv[i]));
}
return result;
}
|