如何使用Ruby将键和值推入空哈希表?

14
我有一个字典类,希望能够使用“add”方法将键(作为关键词)和值(作为定义)推入空哈希表中。我不知道如何在语法上编写它。我也包含了一个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

非常感谢您的帮助。谢谢!

更新: 感谢Dave Newton的回复。我使用了您的代码,但出现了以下错误:

错误:

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

当我使用 @hash[word.to_sym] = defintion 将 'word' 转换为符号时,我会得到一个不同的错误。
 *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"*
2个回答

27

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)这样的东西,它返回一个定义。

另外,你将单词转换为符号,但我不知道为什么——特别是因为你在规范中使用字符串键。选择一个,虽然我不确定这是否是符号增加价值的情况。

请仔细考虑变量命名,以提供尽可能多的上下文。


8

看你的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

为了给add方法提供灵活性,我可以返回self对象以继续添加。

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

所以,现在我可以做到这一点。
@d.add("a" => "apple").add("b" => "bat")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接