红宝石阵列突变混淆



我试图对 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 方法将改变调用它们的值,没有的方法将返回突变的副本。

请参阅此处的文档 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

两者之间有区别吗:

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

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

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

a.每个做|字| 字大写!结束与 相同

a.map do |word| 单词.大写结束

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

最新更新