带链接的Ruby枚举器

时间:2015-02-23 00:21:33

标签: ruby

我是Ruby的新手,我不太了解以下代码。

n = [1,2,3]
n.map!.select{|x| x+=1}
puts n.inspect

会给我

[nil, nil, nil]

我知道n.map!会给我一个调查员,但我不明白为什么调用它会使n变为零。我知道那张地图!将修改原始对象,我只是不明白它是如何实现的。

更新

我尝试了n.map!.select {|x| true},n仍然是[nil, nil, nil]

感谢您的帮助!谢谢!

2 个答案:

答案 0 :(得分:4)

这是因为select方法用于选择。它返回满足您在块中放置的条件的元素。在您的情况下,您没有提出任何条件,因此返回nil

e.g。 你想做这样的事情:

n = [1,2,3]
n.select { |num| num < 3 }  

#=> This should return
#=> [1,2]

答案 1 :(得分:0)

在评论中说:

  

与就地修改地图有关!

是的。让我在这里更清楚:

Array#map!的定义中,它表示:

map! {|item| block } → ary click to toggle source
map! → Enumerator
     

为self的每个元素调用一次给定的块,用该块返回的值替换该元素

所以:

示例1

[58] pry(main)> a = [1,2,3] => [1, 2, 3] [60] pry(main)> e = a.map! => #<Enumerator: ...> [61] pry(main)> e.each {|n| n + 1} => [2, 3, 4] [62] pry(main)> a => [2, 3, 4]

但是:

示例2

[71] pry(main)> a = [1,2,3] => [1, 2, 3] [72] pry(main)> e = a.map! => #<Enumerator: ...> [73] pry(main)> e.next => 1 [74] pry(main)> a => [1, 2, 3] [75] pry(main)> e.peek => 2 [76] pry(main)> a => [nil, 2, 3]

我认为这是由于Enumerator#each调用引起的,它占用了一个块,这将是示例1的返回值;但是调用Enumerator#next时(对Enumerator.to_a相同),它无法评估该块,因此返回nil