如何获取Ruby哈希以删除输出中的大括号

时间:2014-04-08 04:01:10

标签: ruby hash rspec output square-bracket

我开始在Test-First上解决一些示例问题,并制定了一个使用Ruby 1.8.7通过所有RSpec测试的解决方案。我刚升级了我的操作系统,Ruby也升级了;我的代码不再通过RSpec测试。任何人都可以帮助我理解为什么这不再起作用了吗?

我的代码

  def entries 
    @d
  end

错误消息

故障:

1)Dictionary可以添加带有关键字和定义的整个条目

Failure/Error: @d.entries.should == {'fish' => 'aquatic animal'}
   expected: {"fish"=>"aquatic animal"}
        got: {["fish"]=>["aquatic animal"]} (using ==)

差异:

 @@ -1,2 +1,2 @@
   -"fish" => "aquatic animal"
   +["fish"] => ["aquatic animal"]

我无法弄清楚要格式化的内容。 (其中一个RSpec测试是@d在创建时必须为空,所以当我尝试通过显式格式化修改@d时它也会失败,但我想象那是一个简单的类型问题在这里,我不理解。)

更新:更多代码

class Dictionary
  def initialize d = {}
    @d = d
  end

  def entries
    @d
  end

  def keywords
    @d.keys.sort
  end

  def add words
    n_key = words.keys
    n_val = words.values
    @d[n_key] = n_val
  end
end

1 个答案:

答案 0 :(得分:1)

看起来你正试图通过一次添加几个单词来进行某种质量分配,但这不是这样做的方法。

Ruby Hash可以将任何作为键,这包括数组。它不像JavaScript那样会自动转换为字符串,或者与特定字典键类型具有相同类型转换的其他语言。在Ruby中,任何对象都可以。

所以你的添加词方法应该是:

def add words
  words.each do |word, value|
    @d[word] = value
  end
end

使用像@d之类的名称的说明非常糟糕。尝试并更具体地说明这是什么,或者你可能会无休止地混淆人们。充满@dxS之类的程序很难调试和维护。如果有点冗长而不是简洁和模棱两可,最好清楚。

其次,不清楚你的Dictionary课程与Hash本身有什么不同。也许你可以把它变成一个子类并省去一些麻烦。例如:

class Dictionary < Hash
  def keywords
    keys.sort
  end

  def add words
    merge!(words)
  end
end

一般来说,最好使用核心Ruby类来做你想做的事情,然后从那里构建。重新发明轮子导致不兼容和沮丧。内置的Hash类有一大堆实用方法,可以非常方便地进行数据转换,转换和迭代,通过创建自己的不透明包装类来丢失的东西。

merge!方法特别将数据添加到现有的Hash中,这正是您想要的。