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