我是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]
感谢您的帮助!谢谢!
答案 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的每个元素调用一次给定的块,用该块返回的值替换该元素
所以:
[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]
但是:
[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
。