我开始在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
答案 0 :(得分:1)
看起来你正试图通过一次添加几个单词来进行某种质量分配,但这不是这样做的方法。
Ruby Hash可以将任何作为键,这包括数组。它不像JavaScript那样会自动转换为字符串,或者与特定字典键类型具有相同类型转换的其他语言。在Ruby中,任何对象都可以。
所以你的添加词方法应该是:
def add words
words.each do |word, value|
@d[word] = value
end
end
使用像@d
之类的名称的说明非常糟糕。尝试并更具体地说明这是什么,或者你可能会无休止地混淆人们。充满@d
,x
和S
之类的程序很难调试和维护。如果有点冗长而不是简洁和模棱两可,最好清楚。
其次,不清楚你的Dictionary
课程与Hash
本身有什么不同。也许你可以把它变成一个子类并省去一些麻烦。例如:
class Dictionary < Hash
def keywords
keys.sort
end
def add words
merge!(words)
end
end
一般来说,最好使用核心Ruby类来做你想做的事情,然后从那里构建。重新发明轮子导致不兼容和沮丧。内置的Hash类有一大堆实用方法,可以非常方便地进行数据转换,转换和迭代,通过创建自己的不透明包装类来丢失的东西。
merge!
方法特别将数据添加到现有的Hash中,这正是您想要的。