Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Default hash values in Ruby (Rubykoans.com -> about_hashes.rb)

Tags:

ruby

hash

I'm going through about_hashes.rb from RubyKoans. 1 exercise got me puzzled:

 def test_default_value
    hash1 = Hash.new
    hash1[:one] = 1

    assert_equal 1, hash1[:one] #ok
    assert_equal nil, hash1[:two] #ok

    hash2 = Hash.new("dos")
    hash2[:one] = 1

    assert_equal 1, hash2[:one] #ok
    assert_equal "dos", hash2[:two] #hm?
  end

My guess is that Hash.new("dos") makes "dos" the default answer for all non-existent keys. Am I right?

like image 317
Bartek Skwira Avatar asked Feb 08 '12 11:02

Bartek Skwira


1 Answers

Yes, you are right, looks like there is a mistake in ruby koans, hash2[:two] will return "dos"

Take a look at Hash.new method documentation

new → new_hash
new(obj) → new_hash
new {|hash, key| block } → new_hash

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.

Sidenote: You can confirm your expectations in such cases by running the actual code or by executing couple of lines in irb or pry (I recommend pry).

like image 115
Aliaksei Kliuchnikau Avatar answered Sep 28 '22 11:09

Aliaksei Kliuchnikau