2013-02-22 41 views
9

我有一個字典類,希望能夠通過'add'方法將鍵(作爲關鍵字)和值(作爲定義)推送到空的哈希中。我不明白如何在語法上編寫它。我也包含了一個RSPEC文件。如何將鍵和值推入空的哈希w/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 

任何幫助表示讚賞。謝謝!

更新: 謝謝戴夫牛頓的回覆。我用你的代碼,並得到這個錯誤:

錯誤:

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

我得到一個不同的錯誤,當我使用@hash [word.to_sym] =確定指標

轉換「字」成符號
*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"* 

回答

18

實例化Dictionaryinitialize你的哈希:

class Dictionary 
    def initialize 
    @hash = {} 
    end 

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

現在你沒有散列,直到你撥打entries,你沒有。

entries應該回報現有哈希,而不是創建一個新的。

keywords應該返回散列的密鑰。

您不需要訪問器keyworddefinition。這樣的單項在詞典課上沒有意義。你可能想要lookup(word)這樣的返回的一個定義。

另外,您將單詞轉換爲符號,但我不知道爲什麼–特別是因爲您在規範中使用了字符串鍵。挑一個,雖然我不相信這是符號增加價值的情況。

請仔細考慮變量命名,以提供儘可能多的上下文。

3

看着你的Rspec,它看起來像你需要這個設置。

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 

不要在add方法使用key.to_sym,只是key

爲了讓靈活地添加方法,我可以自我對象返回continuesly補充。

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

所以,我現在可以做到這一點。

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