为什么这个散列数组的大小为0?

时间:2014-10-31 11:58:23

标签: ruby arrays size

这是我的代码:

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"

5 个答案:

答案 0 :(得分:3)

首次访问时初始化哈希值时(即,按下尚未存在的键值),您需要在请求时在哈希上设置密钥。

@notes = Hash.new {|h, k| h[k] = []}

作为参考,请参阅ruby repl中的以下结果:

初始化Hash
irb(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)

或更多" ruby​​ish":

@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]