我有一个字典类,希望能够使用'add'方法将键(作为关键字)和值(作为定义)推送到空哈希中.我不明白如何在语法上写它.我也包含了一个RSPEC文件.
红宝石:
class Dictionary
attr_accessor :keyword, :definition
def entries
@hash = {}
end
def add(options)
options.map do |keyword, definition|
@hash[keyword.to_sym] = definition
end
end
end
Run Code Online (Sandbox Code Playgroud)
Rspec的:
require 'dictionary'
describe Dictionary do
before do
@d = Dictionary.new
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
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.谢谢!
更新: 谢谢Dave Newton的回复.我用你的代码得到了这个错误:
错误:
*Failure/Error: @d.keywords.should == ['fish']
NoMethodError:
undefined method `keywords' for #<Dictionary:0x007fb0c31bd458
@hash={"fish"=>"aquatic animal"}>*
Run Code Online (Sandbox Code Playgroud)
当我使用@hash [word.to_sym] = defintion将'word'转换为符号时,我得到了一个不同的错误
*Failure/Error: @d.entries.should == {'fish' => 'aquatic animal'}
expected: {"fish"=>"aquatic animal"}
got: {:fish=>"aquatic animal"} (using ==)
Diff:
@@ -1,2 +1,2 @@
-"fish" => "aquatic animal"
+:fish => "aquatic animal"*
Run Code Online (Sandbox Code Playgroud)
Dav*_*ton 21
在Dictionary's中实例化你的哈希initialize:
class Dictionary
def initialize
@hash = {}
end
def add(defs)
defs.each do |word, definition|
@hash[word] = definition
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在你没有哈希,直到你打电话entries,你没有.
entries应返回的现有散,而不是创建一个新的.
keywords 应该返回哈希的键.
你不需要访问器keyword和definition.这些单数项在字典类中是没有意义的.你可能会想是lookup(word)该回来的定义.
此外,您将单词转换为符号,但我不知道为什么 - 特别是因为您在规范中使用字符串键.选一个,虽然我不相信这是符号增值的情况.
请仔细考虑变量命名,以提供尽可能多的上下文.
看看你的Rspec,看起来你需要这个设置.
class Dictionary
def initialize
@hash = {}
end
def add(key_value)
key_value.each do |key, value|
@hash[key] = value
end
end
def entries
@hash
end
def keywords
@hash.keys
end
end
Run Code Online (Sandbox Code Playgroud)
不要key.to_sym只在添加方法中使用key
为了灵活添加方法,我可以返回self对象继续添加.
def add(key_value)
key_value.each do |key, value|
@hash[key] = value
end
self
end
Run Code Online (Sandbox Code Playgroud)
所以,我现在可以这样做.
@d.add("a" => "apple").add("b" => "bat")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
51767 次 |
| 最近记录: |