即使我只传递一个字符串键,我可以使用hash.each吗?字典没有定义

时间:2013-06-12 18:07:54

标签: ruby dictionary hash parameters each

这是我得到的错误。我需要将一个字符串键传递给一个通常接受字符串键和字符串符号组合

的方法
Dictionary
  is empty when created`
  can add whole entries with keyword and definition
  add keywords (without definition) (FAILED - 1)

  Failures:

    1) Dictionary add keywords (without definition)
       **Failure/Error: @d.add('fish')
       NoMethodError:
         undefined method `each' for "fish":String
       # ./11_dictionary/dictionary.rb:9:in `add'**
       # ./11_dictionary/dictionary_spec.rb:27:in `block (2 levels) in <top (required)>'

这是以下规格。 @d.add('fish')传递一个没有定义的字符串。 要求'字典'

describe Dictionary do
  before do
    @d = Dictionary.new
  end

 it 'is empty when created' do
    @d.entries.should == {}
  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

  it 'add keywords (without definition)' do
    @d.add('fish')
    @d.entries.should == {'fish' => nil}
    @d.keywords.should == ['fish']
  end

我的代码:

我认为我的定义是出错的地方。根据我的理解,每个都通过这个例子中的数组或散列,但只有一个值,所以它不知道如何循环它?所以我考虑为意义和单词设置默认的nil值,但它不接受它并带有不同的错误。

class Dictionary
  attr_accessor :keywords, :entries

  def initialize
    @entries = {}
  end

  def add(definition)
    definition.each do |word, meaning|   
    @entries[word] = meaning

    end
  end

  def keywords
     @entries.keys.sort
  end


  def include?(key)
    @entries.key?(key)
  end

  def find(query)
    @entries.select { |word, definition| word.scan(query).join == query}
  end

  def entries
     @entries
  end

end

先谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

您正试图在each String上致电@d.add('fish'),这是不允许的。您只需在definition.each do |word, meaning|上方添加以下行:

definition = { definition => nil } unless definition.is_a? Hash

如果您将不同类型的对象传递给add,这可能会产生意想不到的后果。

答案 1 :(得分:0)

我的代码很粗糙..这也有效。

def add(hash)

if(hash.is_a?Hash)

  @d=hash

否则

  @d = {hash => nil}