这是我的代码:
def mainFunction
@notes=Hash.new(Array.new)
@notes["First"].push(true)
@notes["First"].push(false)
@notes["First"].push(true)
@notes["Second"].push(true)
output @notes.size.to_s
end
为什么输出0
?它应该是2
,因为notes
有两个键,"First"
和"Second"
。
答案 0 :(得分:3)
首次访问时初始化哈希值时(即,按下尚未存在的键值),您需要在请求时在哈希上设置密钥。
@notes = Hash.new {|h, k| h[k] = []}
作为参考,请参阅ruby repl中的以下结果:
初始化Hashirb(main):063:0> @notes = Hash.new(Array.new)
=> {}
irb(main):064:0> @notes[:foo].push(true)
=> [true]
irb(main):065:0> @notes.has_key?(:foo)
=> false
irb(main):066:0> puts @notes.size
=> 0
现在正确的方式。
irb(main):067:0> @notes = Hash.new {|h, k| h[k] = []}
=> {}
irb(main):068:0> @notes[:foo].push(true)
=> [true]
irb(main):069:0> @notes.has_key?(:foo)
=> true
irb(main):070:0> @notes.size
=> 1
答案 1 :(得分:1)
以下声明:
@notes=Hash.new(Array.new)
使用默认值创建哈希:Array.new
。当您使用未知密钥访问哈希时,您将收到此默认值。
你的其他声明改变了默认数组:
@notes["First"].push(true)
这会将true
添加到默认(空)数组。
您需要先初始化"First"
数组:
@notes["First"] = []
然后你可以添加值:
@notes["First"].push(true)
或更多" rubyish":
@notes["First"] << true
现在的尺寸是:
@notes.size # => 1
答案 2 :(得分:0)
Hash.new(object)
方法调用表单只返回object
作为默认值,但不更新哈希值。
您正在寻找可以进行更新的阻止表单:
@notes=Hash.new {|h, k| h[k] = []}
答案 3 :(得分:0)
@notes = Hash.new(Array.new)将所有元素的默认值设置为同一个数组。由于@notes不包含任何键“First”,因此它返回该默认值,并且.push添加到它的末尾。但是密钥没有添加到哈希中。另一个推送添加到同一默认数组的末尾。
答案 4 :(得分:0)
阅读this Hash.new(obj)
。它声明:
如果指定了obj,则此单个对象将用于所有默认值 值。
因此,当你这样做时:@notes=Hash.new(Array.new)
。默认对象是一个数组。
@notes.default # => []
@notes['First'].push(true)
@notes.default # => [true]
@notes['First'].push(false)
@notes.default # => [true, false]
但是,@notes
中没有任何条目作为密钥,当然您通过提供任何密钥(可能存在或可能不存在)来访问这些值,如下所示:
@notes['unknown_key'] #=> [true, false]