我试图对 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| 单词.大写结束
不。第一个修改数组中的元素,并返回原始数组。第二个返回一个填充有新字符串的新数组。