2012-02-08 24 views
6

Estoy pasando por about_hashes.rb desde RubyKoans. 1 ejercicio me tiene perplejo:Valores hash predeterminados en Ruby (Rubykoans.com -> about_hashes.rb)

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 

Mi conjetura es que Hash.new ("dos") hace que "debe" La respuesta por defecto para todas las claves que no existen. ¿Estoy en lo cierto?

Respuesta

9

Sí, tienes razón, parece que hay un error en koanes rubí, hash2[:two] volverá "dos"

Tome un vistazo a Hash.new documentación del método

nueva → new_hash
nueva (obj) → new_hash
nuevo {| hash, clave | bloque} → new_hash

Devuelve un nuevo hash vacío. Si posteriormente se accede a este hash mediante una clave que no corresponde a una entrada hash, el valor devuelto depende del estilo de new utilizado para crear el hash. En el primer formulario , el acceso devuelve nil. Si se especifica obj, este único objeto se usará para todos los valores predeterminados. Si se especifica un bloque, se llamará al con el objeto hash y la clave, y se devolverá el valor predeterminado . Es responsabilidad del bloque almacenar el valor en el hash si es necesario.

Nota al margen: Puede confirmar sus expectativas en estos casos mediante la ejecución del código real o ejecutando par de líneas en irb o pry (recomiendo de palanca).

+0

He editado mi pregunta, debería ser "dos" en lugar de cero. –

4

El original del koan es:

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

    assert_equal __, hash1[:one] 
    assert_equal __, hash1[:two] 

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

    assert_equal __, hash2[:one] 
    assert_equal __, hash2[:two] 
end 

El error no está en el koan, sino en la afirmación de que haya completado:

assert_equal nil, hash2[:two] #hm? 

... debe ser

assert_equal "dos", hash2[:two] #hm? 
+0

He editado mi pregunta, debería ser "dos" en lugar de cero. –

Cuestiones relacionadas