2012-02-08 11 views
6

Sto passando about_hashes.rb da RubyKoans. 1 esercizio mi ha perplesso:Valori hash predefiniti in 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 

La mia ipotesi è che Hash.new ("DOS") rende "dos" La risposta di default per tutti i tasti inesistenti. Ho ragione?

risposta

9

Sì, hai ragione, sembra che ci sia un errore nel koan rubino, hash2[:two] sarà tornare "dos"

Date un'occhiata a Hash.new documentazione metodo

nuovo → new_hash
nuovo (obj) → new_hash
nuovo {| hash, chiave | blocco} → new_hash

Restituisce un nuovo hash vuoto. Se successivamente si accede a questo hash da una chiave che non corrisponde a una voce hash, il valore restituito dipende dallo stile di nuovo utilizzato per creare l'hash. Nel primo modulo , l'accesso restituisce zero. Se viene specificato obj, questo singolo oggetto verrà utilizzato per tutti i valori predefiniti. Se viene specificato un blocco, verrà chiamato con l'oggetto hash e la chiave e dovrà restituire il valore predefinito . È responsabilità del blocco conservare il valore in l'hash se necessario.

Nota a margine: È possibile confermare le vostre aspettative in questi casi, eseguendo il codice vero e proprio o mediante l'esecuzione di due linee in irb o pry (vi consiglio di leva).

+0

Ho modificato la mia domanda, dovrebbe essere "dos" invece di nil. –

4

L'originale del koan è:

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 

l'errore non è nel koan, ma l'affermazione che hai completato:

assert_equal nil, hash2[:two] #hm? 

... dovrebbe essere

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

Ho modificato la mia domanda, dovrebbe essere "dos" invece di nil. –