Ruby自定义方法来填充哈希

时间:2014-06-13 14:25:51

标签: ruby-on-rails ruby hash

我正在开发一种方法,允许我将“word”及其“定义”添加到哈希中。

这就是我所拥有的:

class Dictionary
def entries
 @entries ||= {}

end

def add word, definition = nil
    entries[word] = definition
    "#{entries}"
end

end

注意:我希望definition参数是可选的,因此我的初始化为nil。但是,由于某种原因,我的输出中出现了这种情况。

示例:传入“鱼”和“水生动物”:

我的输出: {{"fish"=>"aquatic animal"}=>nil}

期望的输出: {"fish"=>"aquatic animal"}

似乎问题在于它将我传递给方法的两个值放入哈希中的第一个键,并将该“nil”值放入该键的值中。我在哪里犯错?

编辑:添加正在进行方法调用的相关RSpec块,以便我可以更好地理解RSpec如何进行此调用:

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

谢谢!

3 个答案:

答案 0 :(得分:1)

你不想做

 @d.add('fish' => 'aquatic animal')

你想做...

 @d.add('fish', 'aquatic animal')

实际上,你将散列作为第一个参数传递,第二个参数为空。

答案 1 :(得分:1)

您的RSpec错误。

@d.add('fish' => 'aquatic animal')更改为@d.add('fish', 'aquatic animal')

您的#add方法接受2个参数,其中一个是可选的。使用您当前的代码,您将传入一个哈希'fish' => 'aquatic animal'。因此,将word设置为哈希值,并将其设置为nil

答案 2 :(得分:1)

如果您想选择接受哈希条目......

def add word, definition = nil
    if word.class == Hash
      entries.merge!(word)
    else
      entries[word] = definition
    end
    "#{entries}"
end