2013-02-22 7 views
9

Ho una classe dizionario e voglio essere in grado di premere tasti (come parole chiave) e valori (come definizioni) in un hash vuoto con un metodo 'aggiungi'. Non capisco come scriverlo sintatticamente. Ho incluso anche un file RSPEC.Come inserire chiavi e valori in un hash vuoto con Ruby?

rubino:

class Dictionary 
    attr_accessor :keyword, :definition 
    def entries 
      @hash = {} 
    end 
    def add(options) 
      options.map do |keyword, definition| 
       @hash[keyword.to_sym] = definition 
      end 
    end 
end 

Rspec:

require 'dictionary' 

    describe Dictionary do 
    before do 
     @d = Dictionary.new 
    end 
    it 'can add whole entries with keyword and definition' do 
     @d.add('fish' => 'aquatic animal') 
     @d.entries.should == {'fish' => 'aquatic animal'} 
     @d.keywords.should == ['fish'] 
    end 

Ogni aiuto è apprezzato. Grazie!

AGGIORNAMENTO: Grazie Dave Newton per la risposta. Ho usato il codice e ottenuto questo errore:

ERRORE:

*Failure/Error: @d.keywords.should == ['fish'] 
NoMethodError: 
undefined method `keywords' for #<Dictionary:0x007fb0c31bd458 
@hash={"fish"=>"aquatic animal"}>* 

ottengo un altro errore quando converto 'parola' in un simbolo utilizzando @hash [word.to_sym] = defintion

*Failure/Error: @d.entries.should == {'fish' => 'aquatic animal'} 
    expected: {"fish"=>"aquatic animal"} 
     got: {:fish=>"aquatic animal"} (using ==) 
    Diff: 
    @@ -1,2 +1,2 @@ 
    -"fish" => "aquatic animal" 
    +:fish => "aquatic animal"* 

risposta

18

istanzia l'hash in initializeDictionary s':

class Dictionary 
    def initialize 
    @hash = {} 
    end 

    def add(defs) 
    defs.each do |word, definition| 
     @hash[word] = definition 
    end 
    end 
end 

In questo momento non hai hash fino a quando non chiami entries, cosa che non fai.

entries dovrebbe ritorno il esistente hash, non crea una nuova.

keywords deve restituire le chiavi dell'hash.

Non sono necessari gli accessor per keyword e definition. Tali elementi singolari non hanno senso in una classe di dizionario. Potresti volere qualcosa come lookup(word) che restituisca una definizione a.

Inoltre, si convertono le parole in simboli, ma non so perché – in particolare poiché si utilizzano chiavi di stringa nelle specifiche. Scegline uno, anche se non sono convinto che questo è un caso in cui i simboli aggiungono valore.

Si prega di considerare attentamente la denominazione delle variabili per fornire più contesto possibile.

3

Guardando il tuo Rspec, sembra che tu abbia bisogno di questa configurazione.

class Dictionary 
    def initialize 
    @hash = {} 
    end 

    def add(key_value) 
    key_value.each do |key, value| 
     @hash[key] = value 
    end 
    end 

    def entries 
    @hash 
    end 

    def keywords 
    @hash.keys 
    end 

end 

Non utilizzare key.to_sym nel metodo Add, basta key

Per dare flessibilità di aggiungere metodo, posso restituire l'oggetto sé per continuesly aggiungere.

def add(key_value) 
    key_value.each do |key, value| 
    @hash[key] = value 
    end 
    self 
end 

Quindi, ora posso farlo.

@d.add("a" => "apple").add("b" => "bat") 
Problemi correlati