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 一个用新字符串填充的新数组。
我正在努力熟悉 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 一个用新字符串填充的新数组。