为什么.map在用于枚举哈希值时会产生一行nils?

时间:2013-10-08 19:00:58

标签: ruby

test = 
 {:content=>"type_name", :content_length=>9, :array_index=>0},
 {:content=>"product_id", :content_length=>10, :array_index=>1},
 {:content=>"First Item", :content_length=>10, :array_index=>0},
 {:content=>"1111", :content_length=>4, :array_index=>1}

pp  test.map {|x| puts x} #=> 
{:content=>"type_name", :content_length=>9, :array_index=>0}
{:content=>"product_id", :content_length=>10, :array_index=>1}
{:content=>"First Item", :content_length=>10, :array_index=>0}
{:content=>"1111", :content_length=>4, :array_index=>1}
[nil, nil, nil, nil]

这一系列的nils是什么原因?地图效果很好,但是它会导致这些无效!

2 个答案:

答案 0 :(得分:0)

问题是#map旨在将数组转换为不同的数组。通常,#map的块不会有副作用。这里使用#map来加倍数组中的所有数字:

[1, 2, 3].map { |n| n * 2}    # => [2, 4, 6]

如果你的循环的目的只是为了产生副作用(比如打印元素),你需要#each:

[1, 2, 3].each { |n| puts n }
# => 1
# => 2
# => 3

在这种情况下,我们不关心#each的返回值。我们关心的是每个数字都被打印出来。

答案 1 :(得分:-1)

唉,这是多么愚蠢的错误! 这解决了它:

test.map {|x| puts x}

我很乐意打印puts语句,irb,试图提供帮助,只返回四次!