ti-enxame.com

Como enviar chaves e valores para um hash vazio com Ruby?

Eu tenho uma classe de dicionário e quero poder Pressionar teclas (como palavras-chave) e valores (como definições) em um hash vazio com um método 'add'. Eu não entendo como escrever isso sintaticamente. Também incluí um arquivo RSPEC.

Ruby:

 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

Qualquer ajuda é apreciada. Obrigado!

ATUALIZAÇÃO: Obrigado Dave Newton por responder. Eu usei seu código e recebi este erro:

ERRO:

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

Recebo um erro diferente ao converter 'Word' em um símbolo usando @hash [Word.to_sym] = definição

 *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"*
12
andy4thehuynh

Instancie seu hash em Dictionary 's initialize:

class Dictionary
  def initialize
    @hash = {}
  end

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

No momento, você não tem hash até chamar entries, o que não faz.

entries deve retornar o existente hash, não criar um novo.

keywords deve retornar as chaves do hash.

Você não precisa de acessadores para keyword e definition. Esses itens singulares não têm sentido em uma classe de dicionário. Você pode querer algo como lookup(Word) que retornado uma definição.

Além disso, você converte palavras em símbolos, mas não sei por que, principalmente porque você usa chaves de seqüência de caracteres em suas especificações. Escolha uma, embora não esteja convencido de que este é um caso em que os símbolos agregam valor.

Por favor, considere a nomeação de variáveis ​​com cuidado para fornecer o máximo de contexto possível.

21
Dave Newton

Olhando para o seu Rspec, parece que você precisa dessa configuração.

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

Não use key.to_sym no método add, apenas key

Para dar flexibilidade à adição de método, posso retornar o objeto próprio para adicionar continuamente.

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

Então, eu posso fazer isso agora.

@d.add("a" => "Apple").add("b" => "bat")
7
Abibullah Rahamathulah