[] | -> | at |
rand_value! | -> | at_rand! |
update | -> | << |
Alias shorthand for update. | ||
values_at | -> | slice |
Alias slice to values_at.
require "facet/hash/slice" h = { :a => 1, :b => 2, :c => 3 } h.slice(:a) #=> [1] h.slice(:a, :b) #=> [1,2] |
||
at_rand! | -> | pick |
Creates a new hash from two arrays —a keys array and a values array.
require 'facet/hash/zipnew' Hah.zipnew(["a","b","c"], [1,2,3]) #=> { "a"=>1, "b"=>2, "c"=>3 }
Add slicing to element assignment operator.
require "facet/hash/slice-op" h = {:a=>1, :b=>2, :c=>3} h[:a] = 9 #=> 9 h #=> {:a=>9, :b=>2, :c=>3} h[:a, :c] = [10,11] #=> [10,11] h #=> {:a=>10, :b=>2, :c=>11}
Modifies the receiving Hash so that the value previously referred to by oldkey is also referenced by newkey; oldkey is retained in the Hash. If oldkey does not exist as a key in the Hash, no change is effected.
Returns a reference to the Hash.
require 'facet/hash/alias!' foo = { :name=>'Gavin', 'wife'=>:Lisa } foo.alias!('name',:name) => { :name=>'Gavin', 'name'=>'Gavin', 'wife'=>:Lisa } foo.alias!('spouse','wife') => { :name=>'Gavin', 'name'=>'Gavin', 'wife'=>:Lisa, 'spouse'=>:Lisa } foo.alias!('bar','foo') => { :name=>'Gavin', 'name'=>'Gavin', 'wife'=>:Lisa, 'spouse'=>:Lisa }
Note that if the oldkey is reassigned, the reference will no longer exist, and the newkey will remain as it was.
require ‘facet/hash/assert_has_keys‘
h = { :a => 1, :b => 2 } h.assert_has_keys( :a ) #=> true h.assert_has_keys( :c ) #=> ArgumentError
require ‘facet/hash/has_keys?‘
h = { :a => 1, :b => 2 } h.assert_has_keys( :a ) #=> true h.assert_has_keys( :c ) #=> ArgumentError
require ‘facet/hash/has_keys?‘
h = { :a => 1, :b => 2 } h.assert_only_keys( :a, :b ) #=> true h.assert_only_keys( :a ) #=> ArgumentError
Returns true is hash has only give keys, otherwise throws an ArgumentError.
require 'facet/hash/assert_has_only_keys' h = { :a => 1, :b => 2 } h.assert_has_only_keys( :a, :b ) #=> true h.assert_has_only_keys( :a ) #=> ArgumentError
Returns a new hash built by iterating through each key,value pair and updating the new hash.
require 'facet/hash/collate'
A "smarter" hasheach which iterates through each value if only one block parameter is given.
require 'facet/hash/each' {:a=>"a", 2=>"b", "x"=>"c"}.each{ |v| puts v }
produces
a b c
WARNING! Use with caution. Methods from other libraries may depend on the old behavior, expecting a two element array to be passed into a single block argument.
Like map/collect, but it generates a Hash. The block is expected to return two values: the key and the value for the new hash.
require 'facet/enumberable/graph' numbers = (1..3) squares = numbers.graph { |n| [n, n*n] } # { 1=>1, 2=>4, 3=>9 } sq_roots = numbers.graph { |n| [n*n, n] } # { 1=>1, 4=>2, 9=>3 }
Returns true or false whether the hash contains the given keys.
require 'facet/hash/has_keys?' h = { :a => 1, :b => 2 } h.has_keys?( :a ) #=> true h.has_keys?( :c ) #=> false
require ‘facet/hash/has_keys?‘
h = { :a => 1, :b => 2 } h.has_keys?( :a ) #=> true h.has_keys?( :c ) #=> false
Returns true or false whether the hash contains only the given keys.
require 'facet/hash/has_only_keys?' h = { :a => 1, :b => 2 } h.has_only_keys?( :a, :b ) #=> true h.has_only_keys?( :a ) #=> false
require ‘facet/hash/has_keys?‘
h = { :a => 1, :b => 2 } h.has_only_keys?( :a, :b ) #=> true h.has_only_keys?( :a ) #=> false
Create a "true" inverse hash by storing mutliple values in Arrays.
require 'facet/hash/inverse' h = {"a"=>3, "b"=>3, "c"=>3, "d"=>2, "e"=>9, "f"=>3, "g"=>9} h.invert #=> {2=>"d", 3=>"f", 9=>"g"} h.inverse #=> {2=>"d", 3=>["f", "c", "b", "a"], 9=>["g", "e"]} h.inverse.inverse #=> {"a"=>3, "b"=>3, "c"=>3, "d"=>2, "e"=>9, "f"=>3, "g"=>9} h.inverse.inverse == h #=> true
Converts all keys in the Hash to be String values, returning a new Hash. With a from_class parameter, limits conversion to only a certain class of keys. It defaults to nil which convert any key class.
require 'facet/hash/keys_to_s' foo = { :name=>'Gavin', :wife=>:Lisa } foo.keys_to_s #=> { "name"=>"Gavin", "wife"=>:Lisa } foo.inspect #=> { :name =>"Gavin", :wife=>:Lisa }
Synonym for Hash#keys_to_string, but modifies the receiver in place (and returns it). With a from_class parameter, limits conversion to only a certain class of keys. It defaults to nil which convert any key class.
require 'facet/hash/keys_to_s' foo = { :name=>'Gavin', :wife=>:Lisa } foo.keys_to_s! #=> { "name"=>"Gavin", "wife"=>:Lisa } foo.inspect #=> { "name"=>"Gavin", "wife"=>:Lisa }
Converts all keys in the Hash to be Symbol values, returning a new Hash. With a from_class parameter, limits conversion to only a certain class of keys. It defaults to String —use nil to convert any key class.
require 'facet/hash/keys_to_sym' foo = { :name=>'Gavin', 'wife'=>:Lisa } foo.keys_to_sym #=> { :name=>"Gavin", :wife=>:Lisa } foo.inspect #=> { "name" =>"Gavin", "wife"=>:Lisa }
Synonym for Hash#keys_to_symbol, but modifies the receiver in place (and returns it). With a from_class parameter, limits conversion to only a certain class of keys. It defaults to String —use nil to convert any key class.
require 'facet/hash/keys_to_symbol' foo = { 'name'=>'Gavin', 'wife'=>:Lisa } foo.keys_to_sym! #=> { :name=>"Gavin", :wife=>:Lisa } foo.inspect #=> { :name=>"Gavin", :wife=>:Lisa }
Returns a random key.
require 'facet/hash/at_rand' {:one => 1, :two => 2, :three => 3}.pick_key #=> :three
Delete a random key-value pair, returning the key.
require 'facet/hash/at_rand' a = {:one => 1, :two => 2, :three => 3} a.pick_key! #=> :two a #=> {:one => 1, :three => 3}
Returns a random key-value pair.
require 'facet/hash/at_rand' {:one => 1, :two => 2, :three => 3}.pick #=> [:one, 1]
Deletes a random key-value pair and returns that pair.
require 'facet/hash/at_rand' a = {:one => 1, :two => 2, :three => 3} a.rand_pair! #=> [:two, 2] a #=> {:one => 1, :three => 3}
Returns a random hash value.
require 'facet/hash/rand_value' {:one => 1, :two => 2, :three => 3}.rand_value #=> 2 {:one => 1, :two => 2, :three => 3}.rand_value #=> 1
Deletes a random key-value pair and returns the value.
require 'facet/hash/at_rand' a = {:one => 1, :two => 2, :three => 3} a.at_rand! #=> 2 a #=> {:one => 1, :three => 3}
Returns a copy of the hash with values arranged in new random order.
require 'facet/hash/shuffle' h = {:a=>1, :b=>2, :c=>3} h.shuffle_hash #=> {:b=>2, :c=>1, :a>3}
Destructive shuffle_hash. Arrange the values in a new random order.
require 'facet/hash/shuffle' h = {:a => 1, :b => 2, :c => 3} h.shuffle_hash! h #=> {:b=>2, :c=>1, :a=>3}
Return the key-value pairs with keys and values shuffled independedly.
require 'facet/hash/shuffle' {:a=>1, :b=>2, :c=>3}.shuffle_hash_pairs
produces
[[:a, 3], [:b, 1], [:c, 2]]
Modifies the receiving Hash so that the value previously referred to by oldkey is referenced by newkey; oldkey is removed from the Hash. If oldkey does not exist as a key in the Hash, no change is effected.
Returns a reference to the Hash.
require 'facet/hash/swapkey!' foo = { :a=>1, :b=>2 } foo.swapkey!('a',:a) #=> { 'a'=>1, :b=>2 } foo.swapkey!('b',:b) #=> { 'a'=>1, 'b'=>2 } foo.swapkey!('foo','bar') #=> { 'a'=>1, 'b'=>2 }
Turns a hash into a generic object using an OpenStruct.
require 'facet/hash/to_ostruct' o = { 'a' => 1 }.to_ostruct o.a #=> 1
Like to_ostruct but recusively objectifies all hash elements as well.
require 'facet/hash/to_ostruct' o = { 'a' => { 'b' => 1 } }.to_ostruct_recurse o.a.b #=> 1
Returns a new hash created by traversing the hash and its subhashes, executing the given block on the key and value. The block should return a 2-element array of the form +[key, value]+.
require 'facet/hash/traverse' h = { "A"=>"A", "B"=>"B" } h.traverse { |k,v| [k.downcase, v] } h #=> { "a"=>"A", "b"=>"B" }
In place version of traverse, which traverses the hash and its subhashes, executing the given block on the key and value.
require 'facet/hash/traverse' h = { "A"=>"A", "B"=>"B" } h.traverse! { |k,v| [k.downcase, v] } h #=> { "a"=>"A", "b"=>"B" }
Iterates through each pair and updates a the hash in place. This is formally equivalent to collate! But does not use collate to accomplish the task. Hence update_each is probably a bit faster.
require 'facet/hash/update_each' # example to do
Weaves two hashes producing a new hash. The two hashes need to be compatible according to the following rules for each node:
<tt> hash, hash => hash (recursive +) hash, array => error hash, value => error array, hash => error array, array => array + array array, value => array << value value, hash => error value, array => array.unshift(valueB) valueA, valueB => valueB </tt>
Example:
require 'facet/hash/weave' # to do