Ruby数组突变混乱?

Ruby Array mutation confusion?

我正在努力熟悉 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

根据经验,ruby methods that end in ! will mutate the value they are called on 和方法没有将 return 一个变异的副本。

请在此处查看 map vs map! and 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

is there a difference between:

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

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

是的。第一个 returns 一个新数组。第二个修改了原来的数组,returns它。

Is

a.each do |word| word.capitalize! end the same as

a.map do |word| word.capitalize end

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