Ruby Array变异混乱?

时间:2016-04-22 23:48:05

标签: arrays ruby ienumerable

我试图对Ruby中的所有数组方法和枚举感到非常满意,但我不明白为什么有些人不会变异而有些人会变异。例如,之间存在差异:

def double(array)
  array.map {|x| x * 2}
end

def double(array)
  return array.map! {|x| x * 2}
end

此外,当我试图打电话时

 b.select{|x| x.even?} 

其中b是整数数组,它没有改变,但是

  b = b.select{|x| x.even?} OR
 .delete_if

确实似乎改变了它。

a.each do |word|
 word.capitalize!
end

相同
a.map do |word|
 word.capitalize
end

2 个答案:

答案 0 :(得分:2)

根据经验,ruby methods that end in ! will mutate the value they are called on和不带方法会返回变异副本。

请参阅此处map vs map!capitalize vs capitalize!

的文档

另请注意,b = b.select{|x| x.even?}并未改变列表b,而是调用b.select来创建一个全新的列表,并将该列表分配给b。请注意区别:

在此,b是同一个对象,只是更改了:

$ irb
@irb(main):001:0> b = [1,2,3]
=> [1, 2, 3]
@irb(main):002:0> b.object_id
=> 69853754998860
@irb(main):003:0> b.select!{|x| x.even?}
=> [2]
@irb(main):004:0> b.object_id
=> 69853754998860

但在此,b现在是一个全新的对象:

$ irb
@irb(main):001:0> b = [1,2,3]
=> [1, 2, 3]
@irb(main):002:0> b.object_id
=> 70171913541500
@irb(main):003:0> b = b.select{|x| x.even?}
=> [2]
@irb(main):004:0> b.object_id
=> 70171913502160

答案 1 :(得分:1)

  

之间有区别:

     

def double(array)array.map {| x | x * 2}结束和

     

def double(array)返回array.map! {| X | x * 2}结束

是。第一个返回一个新数组。第二个修改原始数组,并返回它。

  

     

a.each do | word | word.capitalize!结束与

相同      

a.map do | word | word.capitalize结束

没有。第一个修改数组中的元素,并返回原始数组。第二个返回一个填充了新字符串的新数组。