【问题标题】:Ruby custom method to fill hashRuby自定义方法填充哈希
【发布时间】:2014-06-13 22:52:26
【问题描述】:

我正在研究一种方法,该方法允许我将“单词”及其“定义”添加到哈希中。

这是我所拥有的:

class Dictionary
def entries
 @entries ||= {}

end

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

end

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

例子:传入“fish”和“aquatic animal”:

我的输出: {{"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

谢谢!

【问题讨论】:

  • 它对我有用。向我们展示你是如何调用该方法的。
  • @ArupRakshit 这也是我正在努力解决的问题。这是一个学习 RSpec 的编码项目,所以我实际上并不确定 RSpec 是如何调用该方法的。相关的 RSpec 行已在上面发布 - 如果您也能帮助我更好地理解这部分,我将不胜感激
  • 你能准确地补充一下你是如何调用这个方法的吗?

标签: ruby-on-rails ruby hash


【解决方案1】:

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

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

【讨论】:

  • 太棒了,就是这样。谢谢!
【解决方案2】:

你不想做

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

你想做...

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

实际上,您将哈希作为第一个参数传递,第二个参数为空。

【讨论】:

  • 感谢@SteveTurczyn。我无法更改 RSpec(它只是一个给定的),但我必须弄清楚如何处理 RSpec 传递的哈希值,而不仅仅是 2 个参数。你对我如何编辑我的方法来处理作为第一个参数传入的哈希有什么建议吗?
  • 是的,你可以,我已经添加了另一个答案来解决这个问题。
【解决方案3】:

您的 RSpec 错误。

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

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

【讨论】:

  • 谢谢@Cereal - 我有一种感觉,就是这样的事情正在发生。我无法更改 RSpec(它只是一个给定的),但我必须弄清楚如何处理 RSpec 传递的哈希值,而不仅仅是 2 个参数。你对我如何编辑我的方法来处理作为第一个参数传入的哈希有什么建议吗?
  • 您可以在方法开始时检查哈希。像if word.class == Hash then merge! word 这样的东西会做你想做的事。然后在else 中执行其他功能。
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多